Codeby web-security - новый курс от Codeby Security School

Представляем вашему вниманию новый курс от команды The Codeby - "Тестирование Веб-Приложений на проникновение с нуля". Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое. Подробнее ...


Источник: https://n0where.net/common-htaccess-snippets/

Файл .htaccess (hypertext access) это конфигурационный файл на уровне директорий, он поддерживается несколькими веб-серверами. Благодаря ему возможно децентрализованное управление настройками веб-сервера. Эти файлы раскиданы по каталогам сервера и они способны изменять глобальные настройки сервера для конкретной директории, в которой они размещены и для поддиректорий.

Первоначальное использование .htacces отражено в его названии (гипертекстовый доступ) — контроль разрешения доступа посредством, например, требованием пароля для доступа к контенту. Тем не менее, намного чаще файлы .htaccess используются для переопределения многих других конфигурационных настроек, таких как тип контента, кодировка, CGI обработчики и т.д.

Программное обеспечение сервера Apache обеспечивает распределённое (т. е. на уровне директорий) конфигурирование посредством файлов Hypertext Access. Эти файлы .htaccess включают локализованную тонкую настройку универсальных директив системной конфигурации Apache, которые определены в главном конфигурационном файле Apache. Местные директивы .htaccess должны работать из файла под названием .htaccess. У пользователя должны быть надлежащие разрешения для доступа и/или редактирования файла .htaccess. Кроме того, права доступа файла .htaccess никогда не должны иметь разрешение на запись кем угодно — т. е. это настройка параметров разрешений “644”, которая позволяет всеобщий доступ для чтения, а разрешение на запись даёт только пользователю. Наконец, правила .htaccess применяются к родительской директории (в которой лежит файл) и всем поддиректориям. Т.е. чтобы применить правила настройки ко всему веб-сайту, разместите файл .htaccess в корневой директории сайта.

Обычное использование .htaccess

  • Авторизация, аутентификация — Файл .htaccess часто используется для установки ограничений безопасности для каталога, помните про “access” в имени файла? .htaccess часто сопровождается файлом .htpasswd, в котором собраны валидные имена пользователей и их пароли.
  • Переписывание URL — Серверы часто используют .htaccess для перезаписи длинных, чрезмерно сложны URL в более короткие и лёгкие для запоминания.
  • Блокировки — Используются allow/deny для блокировки IP адреса или домена. Также полезен для блокировки плохих ботов, рипперов и рефереров. Часто используется для ограничения доступа паукам поисковых машин.
  • SSI — включают инклуды на стороне сервера.
  • Листинг каталогов — Контролирует, как сервер будет реагировать, когда специфичная веб-страница (обычно это index.htm, index.html, index.php или любая другая — в зависимости от настройки) отсутствует.
  • Настройка страниц ошибок — Изменение страницы, которая показывается при возникновении ошибки на стороне сервера, например, ошибки HTTP 404 Страница не найдена или дают знать поисковым машинам, что страница была перемещена — HTTP 301 Moved Permanently.
  • MIME types (типы) — Инструктирует сервер, как работать с различными типами файлов.
  • Cache Control (контроль кэша) — .htaccess файлы позволяют серверу контролировать кэширование веб-браузерами и проксями для уменьшения нагрузки на сеть, на сервер и предотвращения проявления лагов.

Комментирование кода в .htaccess

Комментирование — это основа для поддержания контроля за определённым участком кода. Комментарии в коде файла .htaccess ставятся построчно, каждая строка комментариев начинается со знака решётки #. Таким образом, если нам нужно закомментировать несколько строк файла .htaccess, то нам нужно поставить несколько решёток в начале каждого файла. Кроме того, из-за не всегда предсказуемого поведения файла htaccess, разумно включать только алфавитные символы (и, возможно, несколько тире и подчёркиваний) в комментарии файла .htaccess.

Преимущества .htaccess

  • Немедленные изменения — Поскольку файлы .htaccess читаются при каждом запросе, изменения, сделанные в этих файлах, имеют немедленный эффект — в отличие от главного конфигурационного файла, для которого требуется перезапуск сервера, чтобы новые строки возымели эффект.
  • Непривилегированные пользователи — Для серверов с множеством пользователей, часто желательно позволять индивидуальным пользователям использовать их собственную конфигурацию сайта. Использование файлов .htaccess позволяет такую индивидуализацию и для непривилегированных пользователей — поскольку не нужно изменять главные конфигурационные файлы сервера.

Недостатки .htaccess

Контролировать Apache только главными файлами конфигурации сервера часто предпочтительно по причинам безопасности и производительности:

  • Потеря производительности — Для каждого HTTP запроса, когда используется .htaccess, требуется дополнительный доступ к файловой системе в родительскую директорию — для проверки возможных существующих файлов .htaccess в этих родительских директориях, которым разрешено работать с файлами .htaccess.
  • Безопасность — Позволение индивидуальным пользователям модифицировать конфигурационные файлы сервера может стать причиной прорех в безопасности, если настройка не проведена должным образом.

Важная информация для нубов в .htaccess

Поскольку конфигурационынй файл .htaccess очень мощный, даже незначительная ошибка в синтаксисе (вроде пропущенного пробела) может привести к серьёзным неисправностям сервера. Поэтому очень важно сделать резервные копии всего, что связано с вашим сайтом (включая оригинальные файлы .htaccess) до того, как вы начнёте работать с вашим файлом (или файлами) .htaccess. Также важно проверить ваш веб-сайт на работоспособность после внесения любых изменений в ваш файл .htaccess. Если возникнут какие-либо проблемы, то сразу используйте ваши резервные копии для восстановления первоначальной функциональности.

Определения символов регулярных выражений для .htaccess

#

Решётка # инструктирует сервер игнорировать эту строку. Используется для добавления комментариев. Каждая строка комментариев требует свою собственную #. При добавлении комментариев хорошей практикой является использование только букв, номеров, тире и подчёркиваний. Подобная практика поможет ликвидировать/избежать потенциальные ошибки сервера при разборе файлов настроек.

[F]

– Запрещено: инструктирует сервер вернуть код ошибки 403 Forbidden клиенту

[L]

– Последнее правило: поручает серверу остановить перезапись после того, как эта директива будет отработана.

[N]

– Далее: поручает Apache применять правила перезаписи до тех пор, пока не будут пройдены все директивы перезаписи.

[G]

– Больше нет: инструктирует сервер для отправки сообщения статуса Gone (больше не существует).

[P]

– Прокси: инструктирует сервер обработать запрос модом mod_proxy

[C]

– Цепочка: поручает серверу связать текущее правило с предыдущим.

[R]

– Перенаправление: инструктирует Apache сделать редирект, в результате чего браузер запрашивает перезаписанный/модифицированный URL.

[NC]

– Без регистра: устанавливает любые связанные аргументы как регистронезависимые.

[PT]

– Пройти через: инструктирует mod_rewrite вернуть Апачу полученный URL для дальнейшего изменения в соответствии с заданными правилами.

[OR]

– Или: означает логическое “или”, которое связывает два выражения и если хотя бы одно из них будет истинной, то будет выполняться заданное правило.

[NE]

– Не экранировать: инструктирует сервер парсить вывод без экранирования символов.

[NS]

– Без подзапросов: инструктирует сервер пропускать директивы если они находятся внутри подзапроса.

[QSA]

– Добавить строку запроса: говорит серверу добавить строку запроса в конец выражения (URL).

[S=x]

– Пропустить: инструктирует сервер пропустить последующее “x” число правил если выявлено совпадение.

[E=variable:value]

– Переменные окружения: предписывает серверу установить значение переменной окружения “variable” на “value”.

[T=MIME-type]

– Тип Mime: объявляет тип mime целевого ресурса.

[]

– задаёт набор символов, в котором любой символ внутри квадратных скобок будет вызывать соответствие, например, [xyz] будет соответствовать x, y или z.

[]+

– набор символов, в котором любые комбинации внутри квадратных скобок будут вызывать соответствие, например, [xyz]+ будет соответствовать любому числу иксов, игреков и зедов или любым другим комбинациям этих символов.

[^]

– означает НЕ в наборе символов, например, [^xyz] будет соответствовать любому символу, кроме x, y и z.

[a-z]

– тире (-) между двумя символами в наборе символов ([]) означает диапазон символов между ними. например, [a-zA-Z] соответствует всем маленьким и большим буквам от a до z.

a{n}

– определяет точное количество n, предшествующего символа, например, x{3} соответствует ровно трём иксам.

a{n,}

– указывает на n или больше количество повторяющиеся символов. Например, x{3,} соответствует трём или более иксам.

a{n,m}

– устанавливает диапазон чисел между n и m предшествующего символа. Например, x{3,7} соответствует трём, четырём, пяти, шести или семи иксам.

()

– используется для группировки символов, в результате эти символы рассматриваются как единый блок. Например, (perishable)?press будет соответствовать press, с или без префикса perishable.

^

– означает начало тестируемой строки regex (regex = регулярное выражение), например, начало аргумента и последующие символы.

$

– означает конец тестируемой строки regex (regex = регулярное выражение), например, конечный символ и предшествующие ему символы.

?

– указывает на опциональность предшествующего символа. Например, monzas? Будет соответствовать monza или monzas, в то время как mon(za)? Будет соответствовать mon или monza. Например, x? соответствует нулю или одному x.

!

– объявляет отрицание. Например, “!string” соответствует чему угодно кроме “string”.

.

– точка служит указателем на один любой произвольный символ.


– говорит не перезаписывай URL, используется примерно так: “…domain.com.* – [F]”. Реальный пример RewriteRule «.exe» «-» [F] запрещать загрузку файлов с расширением exe. Ведь зачем нам проводить какие-то манипуляции с адресом, если запрос всё равно будет отклонён?

+

– соответствует одному или более предшествующему символу. Например, G+ соответствует одной или более G, в то время “+” будет соответствовать одному или более символу любого рода.

*

– говорит о том, что предшествующий символ повторяется ноль или более раз. Например используйте “.*” как wildcard.

|

– задаёт оператор логическое “или”. Например, (x|y) соответствует x или y.

– экранирует специальные символы ( ^ $ ! . * | ). Например, используйте “.” для индикации/экранирования буквальной точки — т. е. нам нужна именно точка.

.

– означает буквальную точку (экранированную).

/*

– ноль или более слешей.

.*

– ноль или более случайных чисел.

^$

– означает пустую строку.

^.*$

– стандартный паттерн, означающий «что угодно».

[^/.]

– означает один символ, который не слеш и не точка.

[^/.]+

– означает любое количество символов, которые не содержат слешей и точек.

http://

– это буквальное выражение — в этом случае буквальное означение строки — “http://”.

^domain.*

– означает строку, которая начинается на “domain”, после которого могут следовать любые символы.

^domain.com$

– определяет точную строку “domain.com”.

-d

– тестирует, является ли строка существующей директорией

-f

– тестирует, является ли строка существующим файлом

-s

– тестирует, не нулевого ли размера файл в тестовой строке

Коды заголовков перенаправления

301 – Перемещён навсегда

302 – Перемещён временно

403 – Запрещён

404 – Не найден

410 – Больше нет

Распространённые сниппеты .htaccess

Переписывание и Перенаправление

Обратите внимание: Подразумевается, что у вас установлен и включен mod_rewrite.

Включения базового переписывания

# включения базового переписывания
RewriteEngine on 

Адрес принудительно будет иметь www

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]

Адрес принудительно будет иметь www в общем виде

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Адрес принудительно НЕ будет иметь www

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

Адрес принудительно НЕ будет иметь www в общем виде

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.
RewriteCond %{HTTPS}s ^on(s)|off
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www.)?(.+)$
RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]

Принудительное использование протокола HTTPS

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

# Обратите внимание: Также рекомендуется включить HTTP Strict Transport Security (HSTS)
# на вашем HTTPS веб-сайта для помощи в предотвращении атаки человек-по-середине.
# See https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>

Принудительное использование протокола HTTPS за прокси

Полезно если вы имеете прокси перед вашим сервером для TLS.

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Принудительное добавление слешей на конце адреса

RewriteCond %{REQUEST_URI} /+[^.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

Удаление слешей на конце адреса

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]

Удаление слешей на конце адреса в произвольных адресах

Этот сниппет будет перенаправлять пути, заканчивающиеся на слэши, на аналогичные без концевых слешей (кроме реальных директорий), например http://www.example.com/blog/ на http://www.example.com/blog. Это важно для SEO, поскльку рекомендуется иметь канонические URL для каждой страницы.

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

Перенаправить на единичную страницу

Redirect 301 /oldpage.html http://www.example.com/newpage.html
Redirect 301 /oldpage2.html http://www.example.com/folder/

Псевдоним (алиас) для единичной директории

RewriteEngine On
RewriteRule ^source-directory/(.*) /target-directory/$1 [R=301,L]

Псевдоним (алиас) пути до скрипта

FallbackResource /index.fcgi

В этом примере приведён файл index.fcgi, который лежит в каталоге и все запросы к этому каталогу, которые потерпели неудачу из-за отсутствия файла/директории будут перенаправлены на скрипт index.fcgi. Это хорошо, если вы хотите, чтобы baz.foo/some/cool/path обрабатывался скриптом baz.foo/index.fcgi (который также поддерживает запросы на baz.foo) в тоже время поддерживается baz.foo/css/style.css и другое подобное. Узнать истинный путь можно из переменной окружения PATH_INFO, которая доступна в скриптах.

RewriteEngine On
RewriteRule ^$ index.fcgi/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]

Это менее эффективная версия директивы FallbackResource (поскольку использование mod_rewrite сложнее, чем просто обработка директивой FallbackResource), но также и более гибкое.

Перенаправление всего сайта

Redirect 301 / http://newsite.com/

Этот способ не ломает ссылки. Это означает, что запрос www.oldsite.com/some/crazy/link.html превратится в www.newsite.com/some/crazy/link.html. Это крайне полезно, когда вы просто переносите сайт на новый домен.

Псевданимы (алиасы) чистых URL

Этот сниппет позволяет вам использовать «чистые» URL — вроде тех, что без PHP расширения, например, example.com/users вместо example.com/users.php.

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]

Развертывание пользовательских страниц ошибок

# использование пользовательских страниц ошибок

ErrorDocument 400 /errors/400.html
ErrorDocument 401 /errors/401.html
ErrorDocument 403 /errors/403.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html

Обеспечиваем Универсальный Документ Ошибки (Universal Error Document)

# обеспечиваем универсальный документ ошибки
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /dir/error.php [L]

Перенаправлять посетителей на временный сайт во время разработки сайта

# перенаправляем всех посетителей на альтернативный сайт, но сохраняем полный доступ для вас

ErrorDocument 403 http://www.alternate-site.com
Order deny,allow
Deny from all
Allow from 10.0.0.1

Безопасность

Запретить доступ для всех

## Apache 2.2
Deny from all

## Apache 2.4
Require all denied

Запретить доступ для всех, кроме вас

## Apache 2.2
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx

## Apache 2.4
Require all denied
Require ip xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx это ваш IP. Если вы замените последние три цифры, например, на 0/12, этим вы определите диапазон IP внутри этой сети, это оградит вас от проблемы перечислять по отдельности все разрешённые IP.

Разрешить доступ для всех кроме спамеров

## Apache 2.2
Order deny,allow
Allow from all
Deny from xxx.xxx.xxx.xxx
Deny from xxx.xxx.xxx.xxy

## Apache 2.4
Require all granted
Require not ip xxx.xxx.xxx.xxx
Require not ip xxx.xxx.xxx.xxy

Запретить доступ к скрытым файлам и директориям

Скрытые файлы и директории (те, чьи имена начинаются с точки .) должны в большинстве, если не все, быть недоступны для других. Например к этим файлам относятся .htaccess, .htpasswd, .git, .hg…

RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)." - [F]

Как вариант, вы можете выдавать ошибку Not Found (не найдено), чтобы не давать атакующему подсказку:

RedirectMatch 404 /..*$

Отклонить доступ к резервным копиям и исходным кодам

Эти файлы могут быть оставлены некоторыми редакторами text/html (вроде Vi/Vim) и представляют огромную брешь в безопасности, если станут общедоступными.

<FilesMatch "(.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$">
    ## Apache 2.2
    Order allow,deny
    Deny from all
    Satisfy All

    ## Apache 2.4
    Require all denied
</FilesMatch>

Отключение показа содержимого директорий

Options All -Indexes

Отключение показа ваших изображений (хотлинкинг) на других сайтах

RewriteEngine on
# Удалите следующую строку, если вы также хотите заблокировать и с пустыми реферами
RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^https?://(.+.)?example.com [NC]
RewriteRule .(jpe?g|png|gif|bmp)$ - [NC,F,L]

# Если вы хотите отображать баннер «заблокировано» на месте изображения, вставленного в другой сайт.
# замените вышеприведённое правило на:
# RewriteRule .(jpe?g|png|gif|bmp) http://example.com/blocked.png [R,L]

Отключение вставки ваших изображений на чужие сайты (хотлинкинг) для конкретных доменов

Иногда вы хотите отключить хотлинкинг только для некоторых плохих парней.

RewriteEngine on
RewriteCond %{HTTP_REFERER} ^https?://(.+.)?badsite.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^https?://(.+.)?badsite2.com [NC,OR]
RewriteRule .(jpe?g|png|gif|bmp)$ - [NC,F,L]

# Если вы хотите отображать баннер «заблокировано» на месте изображения, вставленного в другой сайт.
# замените вышеприведённое правило на:
# RewriteRule .(jpe?g|png|gif|bmp) http://example.com/blocked.png [R,L]

Защита директории пароолем

Для начала вам нужно где-нибудь создать файл .htpasswd:

htpasswd -c /home/fellowship/.htpasswd boromir

Затем вы можете использовать этот файл для аутентификации:

AuthType Basic
AuthName "Для входа пройдите аутентификацию"
AuthUserFile /home/fellowship/.htpasswd
Require valid-user

Защита паролем файла или нескольких файлов

AuthName "Для входа пройдите аутентификацию"
AuthType Basic
AuthUserFile /home/fellowship/.htpasswd

<Files "one-ring.o">
Require valid-user
</Files>

<FilesMatch ^((one|two|three)-rings?.o)$>
Require valid-user
</FilesMatch>

Блокировать посетителей по Referrer (откуда пришли)

Этим мы закрываем доступ для всех пользователей, которые пришли от (были перенаправлены) с заданного домена.

RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} somedomain.com [NC,OR]
RewriteCond %{HTTP_REFERER} anotherdomain.com
RewriteRule .* - [F]

Предотвращение вставки сайта во фреймы

Это не даёт веб-сайту быть вставленным во фреймы (например, быть размещённым в теге iframe), хотя ещё разрешён фрейминг для особых URI.

SetEnvIf Request_URI "/starry-night" allow_framing=true
Header set X-Frame-Options SAMEORIGIN env=!allow_framing

Предотвращаем доступ к .htaccess

Добавьте следующий блок кода в ваш файл htaccess для добавления дополнительного слоя безопасности. Любые попытки получить доступ к файлу будут приводить к сообщению об ошибке 403. Конечно, ваш первый уровень защиты файлов htaccess заключается в настройке параметров разрешения на файлы через CHMOD на 644.

# защищаем файл htaccess
<Files .htaccess>
order allow,deny
deny from all
</Files>

Предотвращаем доступ к определённым файлам

Для ограничения доступа к определённым файлам, добавьте следующий блок кода и отредактируйте имя файла “file.txt”, заменив его на имя файла, который вы хотите защитить.


Paranoid - курс от Codeby Security School

Представляем вашему вниманию курс от команды codeby - "Комплекс мер по защите персональных данных, анонимности в интернете и не только" Подробнее ...


# prevent viewing of a specific file
<files file.txt>
order allow,deny
deny from all
</files>

Предотвращаем доступ к ряду типу файлов

Для ограничения доступа к ряду типов файлов, добавьте следующий блок кода и отредактируйте типы файлов в круглых скобках, заменив их на расширения тех файлов, которые вы хотите защитить.

<FilesMatch ".(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
Order Allow,Deny
Deny from all
</FilesMatch>

Предотвращаем неавторизованный просмотр директорий

Закройте неавторизованный просмотр директории, указав серверу отвечать ошибкой “xxx Forbidden – Authorization Required” для любой запрос просмотра директории.

# отключение просмотра директорий
Options All -Indexes

Наоборот, для включения просмотра директорий, используйте следующую директиву:

# включение просмотра директорий
Options All +Indexes

Точно также это правило будет препятствовать просмотру содержимого папок на сервере:

# предотвращаем листинг каталогов
IndexIgnore *

Директива IndexIgnore может использоваться для предотвращения отображения выбранных типов файлов:

# не даём отображаться в каталогах выбранным типам файлов
IndexIgnore *.wmv *.mp4 *.avi *.etc

Меняем дефолтную (по умолчанию) индексную страницу

Это правило говорит серверу найти и выдать “business.html” в качестве дефолтного индекса директории. Это правило должно быть в файле htaccess корневой директории для который вы хотите заменить индексный файл по умолчанию.

# выдаём альтернативную дефолтную индексную страницу
DirectoryIndex business.html

Это правило схожее, только в этом случае сервер будет сканировать корневую директорию на список файлов и выдаст первый из списка, который существует на сервере. Список читается слева направо:

# выдаём первую доступную альтернативу индексной страницы из ряда
DirectoryIndex filename.html index.cgi index.pl default.htm

Маскируем расширение скрипта

Для увеличения безопасности, маскируйте скриптовый язык, заменив действительное расширение скрипта на фальшивое по вашему выбору

# обслуживать foo файлы в качестве php файлов
AddType application/x-httpd-php .foo
# обслуживать foo файлы в качестве cgi файлов
AddType application/x-httpd-cgi .foo

Ограничение доступа к локальной сети

# ограничиваем доступа к локальной сети
<Limit GET POST PUT>
order deny,allow
deny from all
allow from 192.168.0.0/33
</Limit>

Безопасность директорий по IP адресами и/или доменам

Все IP адреса разрешены, кроме 1.1.1.1 и codeby.net

# разрешить всё, кроме представленных ниже
<Limit GET POST PUT>
order allow,deny
allow from all
deny from 1.1.1.1
deny from .*codeby.net.*
</Limit>

Все IP адреса отклоняются кроме 1.1.1.1 и codeby.net:

# отклонить все, кроме представленных ниже
<Limit GET POST PUT>
order deny,allow
deny from all
allow from 1.1.1.1
allow from .*codeby.net.*
</Limit>

Блокировка посетителей основываясь на ссылающемся домене

# блокируем посетителей, пришедших с определённых доменов
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} scumbag.com [NC,OR]
RewriteCond %{HTTP_REFERER} wormhole.com [NC,OR]
RewriteRule .* - [F]
</ifModule>

Запрещаем или разрешаем доступ к домену для определённого диапазона IP адресов

# блокируем диапазон IP по номеру CIDR
<Limit GET POST PUT>
order allow,deny
allow from all
deny from 10.10.0.0/16
deny from 10.0.0.0/8
</Limit>

CIDR — Бесклассовая адресация

Подобным образом разрешаем диапазон IP по номеру CIDR:

# разрешаем диапазон IP по номеру CIDR
<Limit GET POST PUT>
order deny,allow
deny from all
allow from 10.10.0.0/16
allow from 10.0.0.0/8
</Limit>

Блокируем IP диапазон сокращённой записью адресов

# блокировать IP диапазон сокращённой записью адресов
<Limit GET POST PUT>
order allow,deny
allow from all
deny from 10.0.0.1
deny from 10.0.0.*
deny from 10.0.*.*
deny from 10.*.*.*
</Limit>

Разрешаем IP диапазон сокращённой записью адресов:

# разрешить IP диапазон сокращённой записью адресов
<Limit GET POST PUT>
order deny,allow
deny from all
allow from 10.0.0.1
allow from 10.0.0.*
allow from 10.0.*.*
allow from 10.*.*.*
</Limit>

Блокируем или пропускаем множество IP адресов на одной строке

Сохраним немного места блокировкой множества IP адресов или диапазонов на одной строке

# блокируем два уникальных IP адреса
deny from 10.0.0.1 10.0.0.2
# блокируем три диапазона IP адресов
deny from 10.1 10.1.1 10.1.2

Пропускаем много IP адресов или диапазонов на одной строке:

# разрешаем два уникальных IP адреса
allow from 10.0.0.1 10.0.0.2
# разрешаем три диапазона IP адресов
allow from 10.1 10.1.1 10.1.2

Останавливаем хотлинкинг, выдавая вместо изображений другой контент

# останавливаем хотлинкинг, выдавая вместо изображений другой контент
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?codeby.net/.*$ [NC]
RewriteRule .*.(gif|jpg)$ http://www.codeby.net/pic.jpg [R,NC,L]
</ifModule>

Для отображения стандартных (или пользовательских, если настроены) страниц ошибок вместо отвратительного изображения, заменить строку, содержащую RewriteRule в вышеприведённой директиве htaccess на следующую:

# выдаём стандартную страницу ошибки 403 запрета доступа
RewriteRule .*.(gif|jpg)$ - [F,L]

Чтобы предоставить разрешения на вставку изображений с вашего сайта на определённые сайты, вставьте этот кусок кода после строки содержащей адрес домена (в нашем примере это “codeby.net”). Не забудьте заменить “goodsite.com” на настоящее доменное имя сайта:

# позволяем следующему сайту вставлять наши картинки
RewriteCond %{HTTP_REFERER} !^http://(www.)?goodsite.com/.*$ [NC]

Блокируем плохих роботов, риперов сайтов и оффлайн браузеры

# отклоняем доступ для плохих роботов, риперов сайтов, оффлайн браузеров и другой неприятной сволочи
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^Anarchie [OR]
RewriteCond %{HTTP_USER_AGENT} ^ASPSeek [OR]
RewriteCond %{HTTP_USER_AGENT} ^attach [OR]
RewriteCond %{HTTP_USER_AGENT} ^autoemailspider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xenu [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus.*Webster [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule ^.* - [F,L]

Или, вместо отправки дружелюбного сообщения об ошибке, отправляйте этих плохих парней на веб-сайт по вашему выбору, просто заменив RewriteRule в последней строке на один из следующих примеров:

# отправляем их на адский веб-сайт по своему выбору
RewriteRule ^.*$ http://www.nsa.gov [R,L]

Или отправляем их в виртуальную чёрную дыру фальшивых email адресов:

# отправьте их в виртуальную чёрную дыру фальшивых email адресов
RewriteRule ^.*$ http://russian-1438361735.spampoison.com [R,L]

Вы также можете включить заданных рефереров для вашего чёрного списка с использованием HTTP_REFERER. Здесь мы используем “bad-domain.ru” в качестве нашего заблокированного примера, и мы используем “yourdomain” в качестве вашего домена (домена, для которого вы блокируете переходы с iaea.org):

RewriteCond %{HTTP_REFERER} ^http://www.bad-domain.ru$
RewriteRule !^http://[^/.].yourdomain.com.* - [F,L]

Защищаем паролем файлы, каталоги

# защищаем паролем один файл
<Files secure.php>
AuthType Basic
AuthName "Prompt"
AuthUserFile /home/path/.htpasswd
Require valid-user
</Files>
# защищаем паролем много файлов
<FilesMatch "^(execute|index|secure|insanity|biscuit)*$">
AuthType basic
AuthName "Development"
AuthUserFile /home/path/.htpasswd
Require valid-user
</FilesMatch>
# защищаем паролем каталоги, в которых находится это правило htaccess
AuthType basic
AuthName "This directory is protected"
AuthUserFile /home/path/.htpasswd
AuthGroupFile /dev/null
Require valid-user
# защищаем паролем каталоги от всех IP, кроме приведённого
# положите этот файл htaccess в каталог, который вы хотите закрыть паролем
AuthType Basic
AuthName "Personal"
AuthUserFile /home/path/.htpasswd
Require valid-user
Allow from 10.0.0.1
Satisfy Any

Требуем SSL (Secure Sockets Layer — уровень защищённых сокетов)

# требуется SSL
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "domain.tld"
ErrorDocument 403 https://domain.tld
# требуем SSL без mod_ssl
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

Автоматически CHMOD различные типы файлов

# гарантируем CHMOD настройки для заданных типов файлов
# помните, никогда не устанавливайте CHMOD 777 если вы не знаете, что вы делаете
# файлы, которые требует доступа для записи, скорее должны быть CHMOD 766 нежели 777
# сохраняйте определённые файлы приватными, настроив их CHMOD на 400
chmod .htpasswd files 640
chmod .htaccess files 644
chmod php files 600

Маскировка расширения файла

Этот метод будет маскировать все типы файлов (т. е. расширения файлов) и представлять их как .php файлы (или с любым другими расширением по вашему выбору):

# маскируем все расширения как php
ForceType application/x-httpd-php

Защищаем от атаки-в-обслуживании (DOS) ограничением размера выгружаемого файла

# защищаемся от атаки DOS, ограничив размер выгружаемого файла
LimitRequestBody 10240000

Защищаем каталоги отключением исполнения скриптов

Предотвращаем вредоносное мозголомство посредством запрещения выполнения скриптов в каталогах, для этого добавьте следующие правила в имеющийся файл htaccess (отредактируйте типы файлов под ваши нужды):

# защищаем каталоги отключением исполнения скриптов
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

Запрашиваем у пользователей пароль на время разработки сайта

# запрос пароля для посетителей
AuthType basic
AuthName "This site is currently under construction"
AuthUserFile /home/path/.htpasswd
AuthGroupFile /dev/null
Require valid-user
# позволяем веб-мастерам и любым другим открытый доступ
Order Deny,Allow
Deny from all
Allow from 1.1.1.1
Allow from favorite.validation/services/
Allow from googlebot.com
Satisfy Any

Закрываем доступ к каталогу в заданные периоды времени

# закрываем доступ в полуночь
RewriteCond %{TIME_HOUR} ^12$
RewriteRule ^.*$ - [F,L]
# предоставляем доступ во второй половине дня
RewriteCond %{TIME_HOUR} ^(12|13|14|15)$
RewriteRule ^.*$ - [F,L]

Производительность

Сжатие текстовых файлов

<IfModule mod_deflate.c>

    # Принудительная компрессия для искромсанных заголовков.
    # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
    <IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)s*,?s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
            RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
        </IfModule>
    </IfModule>

    # Сжимать всё исходящее с одним из следующих типов MIME-types
    # (для Apache версии ниже 2.3.7, вам не нужно включать `mod_filter`
    #  и можете удалить фильтр `<IfModule mod_filter.c>` и `</IfModule>` строки
    #  поскольку `AddOutputFilterByType` всё ещё в основных директивах).
    <IfModule mod_filter.c>
        AddOutputFilterByType DEFLATE application/atom+xml 
                                      application/javascript 
                                      application/json 
                                      application/rss+xml 
                                      application/vnd.ms-fontobject 
                                      application/x-font-ttf 
                                      application/x-web-app-manifest+json 
                                      application/xhtml+xml 
                                      application/xml 
                                      font/opentype 
                                      image/svg+xml 
                                      image/x-icon 
                                      text/css 
                                      text/html 
                                      text/plain 
                                      text/x-component 
                                      text/xml
    </IfModule>

</IfModule>

Задать время истечения заголовков

Время истечения заголовков скажут браузеру, нужно ли данный файл запросить от сервера или просто вытащить его из кэша. Рекомендуется для статичного контента установить время истечения заголовков на что-нибудь далёкое в будущем. Если вы не контролируете изменение версий с помощью перебора основанного на файлах, подумайте о том, чтобы уменьшить время кэша для ресурсов вроде CSS и JS до чего-нибудь вроде одной недели.

<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault                                      "access plus 1 month"

  # CSS
    ExpiresByType text/css                              "access plus 1 year"

  # Data interchange
    ExpiresByType application/json                      "access plus 0 seconds"
    ExpiresByType application/xml                       "access plus 0 seconds"
    ExpiresByType text/xml                              "access plus 0 seconds"

  # Favicon (cannot be renamed!)
    ExpiresByType image/x-icon                          "access plus 1 week"

  # HTML components (HTCs)
    ExpiresByType text/x-component                      "access plus 1 month"

  # HTML
    ExpiresByType text/html                             "access plus 0 seconds"

  # JavaScript
    ExpiresByType application/javascript                "access plus 1 year"

  # Manifest files
    ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
    ExpiresByType text/cache-manifest                   "access plus 0 seconds"

  # Media
    ExpiresByType audio/ogg                             "access plus 1 month"
    ExpiresByType image/gif                             "access plus 1 month"
    ExpiresByType image/jpeg                            "access plus 1 month"
    ExpiresByType image/png                             "access plus 1 month"
    ExpiresByType video/mp4                             "access plus 1 month"
    ExpiresByType video/ogg                             "access plus 1 month"
    ExpiresByType video/webm                            "access plus 1 month"

  # Web feeds
    ExpiresByType application/atom+xml                  "access plus 1 hour"
    ExpiresByType application/rss+xml                   "access plus 1 hour"

  # Web fonts
    ExpiresByType application/font-woff2                "access plus 1 month"
    ExpiresByType application/font-woff                 "access plus 1 month"
    ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
    ExpiresByType application/x-font-ttf                "access plus 1 month"
    ExpiresByType font/opentype                         "access plus 1 month"
    ExpiresByType image/svg+xml                         "access plus 1 month"
</IfModule>

Отключение eTags

Удалив заголовок ETag, вы отключаете кэши и браузеры от возможности валидировать файлы, следовательно они будут вынуждены полагаться на ваши заголовки Cache-Control и Expires.

<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None

Множественное использование правил из httpd.conf

Сберегите своё время и силы по созданию дублирующих правил для множества виртуальных хостов. Пропешите их только один раз в вашем файле httpd.conf. Затем просто укажите целевому файлу (файлам) htaccess наследовать правила из httpd.conf, это делается следующей директивой:

RewriteOptions Inherit

Улучшите производительность через AllowOverride

# увеличить производительность отлючением allowoverride
AllowOverride None

Повышение производительности через указание кодировки

Предотвратим определённую ошибку 500, указав кодировку по умолчанию. Примечание: замените “utf-8” на желаемую юкодировку.

# задаём кодировку по умолчанию
AddDefaultCharset utf-8

Повышение производительности за счет сохранения полосы пропускания

Для повышения производительности на серверах с включённым PHP добавьте следующую директиву.

# повысить производительность за счет сохранения полосы пропускания
<ifmodule mod_php4.c>
php_value zlib.output_compression 16386
</ifmodule>

Отключаем подпись (сигнатуру) сервера

Здесь мы отключаем цифровую сигнатуру, которая в противном случае может служить для идентификации сервера.

# отключаем сигнатуру сервера
ServerSignature Off

Улучшаем скорость сайта включением кеширования файлов

# кешируем изображения и флеш на один месяц
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
# кешируем текстовые, css, и javascript файлы на одну неделю
<FilesMatch ".(js|css|pdf|txt)$">
Header set Cache-Control "max-age=604800"
</FilesMatch>
# кешируем html и htm files на один день
<FilesMatch ".(html|htm)$">
Header set Cache-Control "max-age=43200"
</FilesMatch>
# реализуем минимальное кеширование на время разработки сайта
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|js|css|pdf|swf|html|htm|txt)$">
Header set Cache-Control "max-age=5"
</FilesMatch>
# явно отключаем кеширование для скриптов и других динамических файлов
<FilesMatch ".(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
# альтернативной метод кеширования файлов
ExpiresActive On
ExpiresDefault A604800 # 1 неделя
ExpiresByType image/x-icon A2419200 # 1 месяц
ExpiresByType application/x-javascript A2419200 # 1 месяц
ExpiresByType text/css A2419200 # 1 месяц
ExpiresByType text/html A300 # 5 минут
# отключаем кеширование для скриптов и других динамических файлов
<FilesMatch ".(pl|php|cgi|spl|scgi|fcgi)$">
ExpiresActive Off
</FilesMatch>

* Конвертирование распространённых интервалов в секунды:

  • 300 = 5 минут
  • 2700 = 45 минут
  • 3600 = 1 час
  • 54000 = 15 часов
  • 86400 = 1 день
  • 518400 = 6 дней
  • 604800 = 1 неделя
  • 1814400 = 3 недели
  • 2419200 = 1 месяц
  • 26611200 = 11 месяцев
  • 29030400 = 1 year = никогда не истечёт

Разное

Установка переменных PHP

php_value <key> <val>

# Например:
php_value upload_max_filesize 50M
php_value max_execution_time 240

Установка временной зоны сервера (timezone)

Указываем серверу жить по часам определённой временной зоны

# установка временной зоны сервера
SetEnv TZ Europe/Moscow

Установка адреса электронный почты администратора сервера

Задаём email по умолчанию для администратора сервера

# задать email по умолчанию для администратора сервера
SetEnv SERVER_ADMIN default@domain.com

Устанавливаем язык по умолчанию

Это простой способ настроить язык по умолчанию для страниц, обслуживаемых вашим сервером (отредактируйте язык, в соответствии с вашими требованиями)

# установить язык по умолчанию
DefaultLanguage ru

Объявляем особые/дополнительные типы MIME

# добавляем различные типы mime
AddType application/x-shockwave-flash .swf
AddType video/x-flv .flv
AddType image/x-icon .ico

Разрешаем только запросы GET и PUT

# лимитируем серверные запросы методами GET и PUT
Options -ExecCGI -Indexes -All
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD) RewriteRule .* - [F]

Выдаём разные файлы в зависимости от метода запроса

# сервер выдаёт различные файлы в зависимости от метода запроса
Script PUT /cgi-bin/upload.cgi
Script GET /cgi-bin/download.cgi

Устанавливаем настройку кодировки и других заголовков без мета тегов

# отправляем язык тега и кодировку по умолчанию
AddType 'text/html; charset=UTF-8' html
AddDefaultCharset UTF-8
DefaultLanguage ru

Выполнение различных скриптов через скрипт cgi

Для тех особых случаев, когда определенные типы файлов должны быть обработаны некоторыми конкретными скриптами CGI

# обработать все png через png-script.cgi
Action image/png /cgi-bin/png-script.cgi

Включение символьных ссылок

Включите символьные ссылки (symlinks) добавлением следующей директивы к файлу htaccess целевой директории. Примечание: для работы директивы FollowSymLinks должна быть включена опция AllowOverride в конфигурационном файле сервера.

# включение символьных ссылок
Options +FollowSymLinks

Включение AllowOverride

Для улучшения производительности рекомендуется включать AllowOverride только в отдельной директории или директориях для которых это нужно. В следующем отрезке кода мы включаем привилегии AllowOverride только в заданной директории.

# включение привилегий allowoverride
<Directory /www/replace/this/with/actual/directory>
AllowOverride Options
</Directory>

Комментируем файл htaccess

# это комментарий
# каждая строка комментария должна иметь свой собственный символ решётки
# используйте только алфавитные символы, а также тире - и подчёркивание _

Переименование файла htaccess

Эта директива должна быть размещена в конфигурационном файле сервера, иначе она не будет работать

# переименовать файлы htaccess
AccessFileName ht.access

Пользовательские страницы ошибок

ErrorDocument 500 "Хьюстон, у нас проблема."
ErrorDocument 401 http://error.example.com/mordor.html
ErrorDocument 404 /errors/halflife3.html

Принудительная загрузка

Иногда вы хотите, чтобы браузер загружал некий контент вместо отображения его.

<Files *.md>
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</Files>

Предотвращение загрузки

Иногда вы хотите принудить браузер отображать контент вместо его загрузки.

<FilesMatch ".(tex|log|aux)$">
    Header set Content-Type text/plain
</FilesMatch>

Разрешить междоменные шрифты

CDN-served webfonts не работают в Firefox или IE из-за CORS. Этот сниппет решает эту проблему.

<IfModule mod_headers.c>
    <FilesMatch ".(eot|otf|ttc|ttf|woff|woff2)$">
        Header set Access-Control-Allow-Origin "*"
    </FilesMatch>
</IfModule>

Автоматическая кодировка UTF-8

Ваш текстовый контент должен всегда быть закодирован в UTF-8, так?

# Использовать кодировку UTF-8 для всего на сервере text/plain или text/html
AddDefaultCharset utf-8

# Принудительно использовать UTF-8 для ряда форматов файлов
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Переключение на другую версию PHP

Если у вас общий хостинг, есть шанс, что установлена более чем одна версия PHP, а иногда вам нужна конкретная версия для вашего веб-сайта. Следующий сниппет должен переключить PHP версию для вас

AddHandler application/x-httpd-php55 .php

# В качестве альтернативы вы можете использовать AddType
AddType application/x-httpd-php55 .php

Посмотрите “Хостинг с выбором версии PHP”.

Отключить Internet Explorer Compatibility View

Просмотр в режиме совместимости в IE может оказать влияние на как отображаются некоторые сайты. Следующий сниппет должен принудить IE использовать движок Edge Rendering и отключить просмотр в режиме совместимости.

<IfModule mod_headers.c>
    BrowserMatch MSIE is-msie
    Header set X-UA-Compatible IE=edge env=is-msie
</IfModule>

Работа с изображениями WebP

Если поддерживаются WebP и изображения с расширениями .webp и теми же именами найдены в том же месте где и изображения jpg/png, которые нужно отправить, то тогда вместо них отправляются изображения WebP.

RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+).(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]

Использование базовой проверки правописания URL

# автоматически корректируем простые орфографические ошибки
<IfModule mod_speling.c>
CheckSpelling On
</IfModule>

Указываем браузеру загружать мультимедийные файлы, а не отображать их

# говорим браузеру загружать мультимедийные файлы
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .wmv
AddType application/octet-stream .mp3

Указываем серверу отображать исходный код для динамических типов файлов

RemoveHandler cgi-script .pl .py .cgi

Активируем SSI для файловых типов HTML/SHTML

# активировать SSI для HTML и или SHTML типов файлов
AddType text/html .html
AddType text/html .shtml
AddHandler server-parsed .html
AddHandler server-parsed .shtml
AddHandler server-parsed .htm

Даём доступ CGI для конкретной директории

# дать CGI доступ для конкретной директории
Options +ExecCGI
AddHandler cgi-script cgi pl
# все скрипты в директории могут использовать следующее
SetHandler cgi-script

Отключаем magic_quotes_gpc для серверов с PHP

# отключить magic_quotes_gpc для серверов с PHP
<ifmodule mod_php4.c>
php_flag magic_quotes_gpc off
</ifmodule>

Включение MD5 digests

Примечание: включение этой опции может стать причиной относительного замедления производительности сервера

# включение MD5 digests через ContentDigest
ContentDigest On

Codeby Market от Сodeby

Мы запустили свой магазин CodebyMarket Equipment for InfoSec. Уже добавили RaspberryAlfa Long-RangeOrange PiArduino и многое другое. Купить Pentesting Devices