Статьи ⇒ Общее ⇒ Повышаем безопасность сайта при помощи .htaccess

Повышаем безопасность сайта при помощи .htaccess

Опубликовано: 21 апр 2011 в 15:53
Автор: freeeeez  

Файл .htaccess (Hypertext Access) это файл настройки Apache-сервера. В Сети довольно много статей по настройке .htaccess. Этому даже посвящены целые сайты. Однако, когда я приступал к изучению мануалов по настройке файла .htaccess, я мало что понял, уж очень запутано пишут. К тому же вопросам безопасности сайта уделяется мало внимания.

hypertext access


В предыдущих статьях я указывал на использование файла .htaccess для настройки сообщений об ошибках и индексации директорий. Эту статью я решил написать, чтобы собрать все способы защиты сайта в одном месте. Безопасность сайта заключается в усложнении процесса взлома для хакера и преграда с использованием .htaccess будет в плюс к защите. Надеюсь, что для вас информация будет полезной.

Итак, приступим.

Создаем .htaccess

root .htaccess — это обычный текстовый файл, правда с необычным расширением. На хостингах, с которыми я работал, есть возможность создавать и управлять файлом .htaccess прямо из панели управления сайтом. Если же на вашем хостинге такой поддержки нет, вам следует создать текстовый файл с расширением .htaccess у себя на компьютере (например в блокноте) и через FTP-соединение загрузить его в корневую директорию. Действие файла-конфигуратора распространяется на все вложенные директории. Чтобы изменить настройки для определенной директории (например, admin) следует разместить там другой файл .htaccess с новыми настройками.

Первое, что необходимо сделать, это включить перенаправления на основной домен сайта, то есть определиться с доступом к сайту с www или без, а также убрать все index.php. Это нужно для правильной индексации сайта, ведь без этого ваш сайт будет доступен по четырем адресам:

http://www.site.ru/
http://www.site.ru/index.php
http://site.ru/
http://site.ru/index.php

Пример #1 Включаем переадресацию на www.site.ru

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^site.ru
RewriteRule (.*) http://www.site.ru/$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.site.ru/ [R=301,L]

 

redirect301


Естественно вместо site ставьте свой адрес. Для того, чтобы сделать редирект на домен без www, следует изменить в третей строке www.site.ru после ^ и далее везде убрать www.

 

Прячем расширения файлов

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

Пример #2 Прячем расширение .php

RewriteRule ^(.*)\$ $1.php [L]
#теперь при доступе к http://www.site.ru/home
#будет открываться http://www.site.ru/home.php
#[L] скрывает реальный адрес от посетителя

Пример #3 Меняем расширение .php на .asp

RewriteRule ^(.*)\.asp$ $1.php [L]
#теперь при доступе к http://www.site.ru/home.asp
#будет открываться http://www.site.ru/home.php

Но это не всегда удобно. Ведь если у мы передаем GET-параметры в URL, запрос будет выглядеть так:

http://www.site.ru/blog?id=1

или так

http://www.site.ru/blog.asp?id=1

Для этого необходимо изменить всю строку запроса, чтобы не выделять параметры так очевидно. Это называется Человеко-Понятный URL (ЧПУ).

Прячем GET-параметры в ЧПУ

В любой CMS вы можете это сделать в панели администрирования, но если вы не пользуетесь системами управления контентом и делаете все своими руками, как я, писать ЧПУ придется через .htaccess.

Допустим у нас есть catalog.php. В него мы передаем title и year. В нашем случае ссылка выглядит так:

catalog.php?year=2011&title=example

А нам надо преобразовать URL к следующему виду:

catalog/2011/example.cgi

Пример #4 Сделаем Человеко-Понятный URL (ЧПУ)

RewriteRule ^catalog/[0-9]{4}/(.*).cgi$ catalog.php?year=$1&title=$2 [L]

Теперь, введите в адресную строку браузера catalog/2011/example.cgi и вы попадеете на catalog.php?year=2011&title=example (чтобы увидеть редирект поставьте [R]). После таких преобразований все ваши ссылки на сайте должны быть приведены к такому виду. Надеюсь пример понятен, а если нет, то пишите комментарии, разберемся.

Управляем выводом ошибок

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

Пример #5 Включаем вывод ошибок для отладки приложения

php_flag display_errors on 
php_value error_reporting E_ALL

Пример #6 Выключаем вывод ошибок после отладки

php_flag display_errors off
php_value error_reporting 0

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

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

Пример #7 Запрет доступа к файлу .htpasswd

<FilesMatch ".htpasswd">
   Order allow,deny
   Deny from all
</FilesMatch>

Пример #8 Запрет доступа к конфигурационным файлам .inc и .cfg

<FilesMatch "\.(inc|cfg)$">
   Order allow,deny
   Deny from all
</FilesMatch>

Теперь при запросе http://www.site.ru/config.inc пользователь получит ошибку 403.

Запрет доступа к директории

Для запрета доступа к целой директории необходимо создать в ней файл .htaccess со следующим содержанием:

Пример #9 Запрет доступа к директории

Order allow,deny
Deny from all

Иногда нужно запретить доступ к директории всем кроме определенных ip-адресов. Это можно сделать для защиты административной части сайта.

Пример #10 Доступ для определенного ip-адреса

Order allow,deny
Deny from all
Allow from <--ip-->

Аутентификация пользователя

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

Пример #11 Разрешаем доступ только для администратора

AuthName 'Stuff only'
AuthType Basic
AuthUserFile '/home/users/yousite/.htpasswd'
Require user admin

Файл .htpasswd содержит имена пользователей и хеш пароля. Он создается с помощью утилиты htpasswd.exe и располагается в корневой директории. Теперь, при доступе к защищенной директории пользователь увидит:
 

basic authentication


Обратите внимание на предупреждение, что пароль будет передаваться в незашифрованном виде. Это значит, что при определенных обстоятельствах он может быть перехвачен. Не используйте данный вид аутентификации для защиты чрезвычайно важных данных.

Защита файлов от скачивания (hotlink)

Hotlink - это вставка ссылки на файл с одного сайта на другой. Обычно хотлинки используют для того, чтобы не загружать изображение на сервер, а использовать фотохостинг для этих целей. Однако некоторые веб-мастера используют хотлинки при копировании контента с вашего сайта, тем самым нагружая трафик на сервер. Защититься от этого можно, узнавая HTTP_REFERER клиента, и если это не поисковая система, блокируя соединение (403 ошибка).

Пример #11 Защита от хотлинка

RewriteCond %{HTTP_REFERER} !^$
#Далее список разрешенных сайтов
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?yoursite.ru.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?yandex.ru [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?google. [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?msn. [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?yahoo. [NC]
RewriteCond %{HTTP_REFERER} !search?q=cache [NC]
#Список запрещенных для хотлинка форматов
RewriteRule \.(jpe?g|bmp|gif|png|css|zip|pdf|txt|doc)$ - [NC,F,L]

Не забудьте поменять yoursite на свой сайт.

Источник: HTTPD Apache внешняя ссылка
34 комментария
27 689 просмотров


#1 Julia, 30 апр 2011 в 17:30
неплохая статья, добавь еще про защиту картинок от скачиваний, я видела на одном сайте
#2 freeeeez, 1 май 2011 в 00:38
Ок. Ждите апдейта.
#3 freeeeez, 2 май 2011 в 12:20
UPDATE. Добавил защиту от хотлинка. Пример рабочий.
#4 info1188, 25 мар 2012 в 23:00
Спасибо Вам большое. Очень помог Ваш пост!
#5 VoLk, 9 апр 2012 в 14:39
Скажите, можно ли как-нибудь защитить файлы стилей (с разрешением css) от открытия (если прописывать в браузере полный путь), но в тоже время, чтобы в шаблоне всё корректно отображалось?
#6 freeeeez, 9 апр 2012 в 15:23
Нет, скрыть таким образом файлы .css не получится.
#7 VoLk, 9 апр 2012 в 15:25
А есть какой-либо способ это сделать?
#8 freeeeez, 9 апр 2012 в 15:29
Можно по примеру 7:
<FilesMatch "style.css">
Order allow,deny
Deny from all
</FilesMatch>

Только в шаблоне работать не будет... Любой доступ к файлу будет закрыт. А могу я поинтересовать зачем закрывать стили?
#9 VoLk, 9 апр 2012 в 15:41
Такой способ пробовал(
чтобы не сделали рип шаблона, т.к. шаблон разрабатывал сам
#10 freeeeez, 9 апр 2012 в 17:10
Ну если найдете достойное решение, отпишитесь, буду очень признателен.
#11 himax, 5 сен 2012 в 20:39
А есть способ защитить от копирования текстового контента. Защита от недобросовестных вебмастеров?
#12 freeeeez, 5 сен 2012 в 20:41
himax, к сожалению, такого способа нет. Все, что отображается в браузере пользователя может быть скопировано при помощи функционала операционной системы.
#13 himax, 5 сен 2012 в 21:18
Не подскажите, как реализовано здесь
http://staron.com/staron/eng/gallery/gallery.do
Текст не копируется
#14 freeeeez, 5 сен 2012 в 21:24
himax, на том сайте всего лишь отключен правый клик мыши по рабочей области браузера. Это является защитой только от новичков. Более или менее разбирающийся в данном вопросе вебмастер найдет способ скопировать данный текст, а вот легитимному пользователю это только принесет ненужные проблемы.

Как отключить правый клик мыши можете почитать здесь.

Скопировать текст с того сайта (да и вообще любой текст с экрана) можно с помощью программы Kleptomania.
#15 slowbro, 13 ноя 2012 в 12:22
to himax, скопировать текст можно нажав ctrl+u из исходного кода страницы
#16 Antikiok, 2 июн 2013 в 19:55
за статью спасибо, правда еще с ЧПУ не совсем разобрался, и насчет index.php не совсем ясно вот что. допустим у меня тип site.ru/razdel/ там информация, я воспользовался вашим советом насчет index.php для главной и помогло, а вот как в каждом /razdel/index.php сделать редирект не пойму, что для каждой страницы с алиасом надо прописывать редирект? т.к. получаеться в подобных раздел1 раздел 2 и т.д. создаются дубли страниц
#17 freeeeez, 2 июн 2013 в 21:56
Не нужно ничего для этого делать. Если я правильно вас понял, то у вас razdel это директория на сервере, а в ней index.php. По адресу site.ru/razdel/ как раз и открывается index.php из этой папки. Так что просто на сайте в меню или еще где просто указывайте site.ru/razdel/
#18 Вадим, 17 июн 2013 в 22:39
Спасибо огромное за информацию. Очень пригодилась когда настраивал свой файл htaccess для сайта.
#19 Viktor, 8 июл 2013 в 18:37
Здравствуйте, нашел ваш сайт через поиск, прочитал вашу статью - очень и очень познавательно, но у меня проблема в другом.
сайт на CMS DLE, при попытке прописать в статье "....." меняется на [url=http://www.site.ru/]"......."[/url] ?
Почему - не могу понять а мне необходимо именно в href.
Возможно вы знаете в чем проблема?
Буду ждать вашего совета..
Виктор
#20 Viktor, 8 июл 2013 в 18:39
Здравствуйте, нашел ваш сайт через поиск, прочитал вашу статью - очень и очень познавательно, но у меня проблема в другом.
сайт на CMS DLE, при попытке прописать в статье а href="http://www.site.ru/" title=".......">"....."
#21 freeeeez, 8 июл 2013 в 22:28
Виктор, понял вашу проблему. Видимо где-то в настройках стоит автозамена тегов. Здесь подобную проблему рассматривали http://dle.net.ua/forum/index.php?topic=7984.0
#22 g_dogg, 23 окт 2013 в 12:25
Как преврать site/index.php?about в site/about ?
#23 freeeeez, 23 окт 2013 в 12:29
Частный случай: RewriteRule ^about$ index.php?about [L] (для данного варианта)
Общее решение: RewriteRule ^(.*)$ index.php?$1[L] (если все страницы такого вида index.php?***)
#24 hleborobov, 28 окт 2013 в 10:51
Мне нужно дать доступ к папке, в пределах сервера Apache, по PUT и GET, к файлам определённого типа. Подскажите — как это прописать в htaccess?
#25 Михаил, 7 ноя 2013 в 15:52
Заливают регулярно на сайт файлы (js скрипты) с произвольными названиями, в произвольные папки.Есть возможность запретить заливк такого типа файлов в каталог?
Зарание благодарен.
#26 freeeeez, 7 ноя 2013 в 16:09
Это делается в скрипте, который проверяет у вас загружаемые файлы, пример:
$blacklist = array(".php", ".phtml", ".php3", ".php4",".exe",".js");
foreach ($blacklist as $item) {
if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
echo "Нельзя загружать такие файлы!";
exit;
}
}
#27 Михаил, 7 ноя 2013 в 17:44
Понял вас freeeee.Но просто заливают, не через скрипт, а скорее всего из-за какой-то дыры самого скрипта (дле), либо залит уже какой-то шел (пользую парсеры, модули с паблика). Почему так подумал, потому как заливают в системные папки, аля engine/data или templates/smartphone/dleimages и т.п.
Как залить в эти папки с помощью скрипта, я не знаю, спомощью SSH или панели управления сервером да.
Вот и подумал что проще так закрыть чем шелл искать.
#28 Михаил, 7 ноя 2013 в 17:48
А вариант подбора пароля к серверу тоже исключен, сайты делаю только на дле, есть 2 сервера разных, заливают (судя по касперу) одновременно такое впечатление что находят просто дле сайты составляют списки и пользуют дыру или шелл.
#29 freeeeez, 7 ноя 2013 в 19:23
Можно как в примере #8 сделать и запретить вообще доступ к .js, но это если сами не используете скрипты. Нужно искать дыру, закрывать...
#30 Михаил, 7 ноя 2013 в 19:34
То бишь, так прописать:

Order allow,deny
Deny from all


А если так :
Order allow,deny
Deny from all
То ко всем файлам в директории доступа (запись, исполнние и чтение) не будет, да?
#31 Михаил, 7 ноя 2013 в 19:35
FilesMatch "\.(js)$"
Order allow,deny
Deny from all
/FilesMatch
не пропустило в пердыдущем коменте скобки, пришлось убрать.
#32 Antonova Alexa , 19 ноя 2015 в 22:36
Статья очень полезная и постоянно ее рекомендую нашим начинающим работникам и всем новым владельцам сайтов.
Указанная в данной статье информация реально помогает решить проблемы с безопасностью сайта!
Автору респект и уважение!
#33 СексШоп, 28 июн 2016 в 16:47
Все отлично, получилось)
#34 Егор, 2 ноя 2016 в 16:42
Подскажите, пожалуйста, по такому вопросу:
Мне нужно закрыть доступ к скрипту со всех источников, но сам скрипт должен ежедневно исполняться по крон. Каким образом мне поступить?
Я думаю - папку с подобными скриптами хтаццессом закрыть для всех, но открыть доступ для IP сервера. Так должно же работать?

Оставить комментарий:

Имя:
Email:
Сайт:
Комментарий:

Допустимые теги: <em> • <strong> • <u> • <sub> • <sup> • <blockquote>

Проверочный код:

Введите проверочный код, для подтверждения, что вы не робот.
P.S. Если вы робот, то, к сожалению, вы
не сможете прочитать символы с картинки.