Повышаем безопасность сайта при помощи .htaccess
Файл .htaccess (Hypertext Access) это файл настройки Apache-сервера. В Сети довольно много статей по настройке .htaccess. Этому даже посвящены целые сайты. Однако, когда я приступал к изучению мануалов по настройке файла .htaccess, я мало что понял, уж очень запутано пишут. К тому же вопросам безопасности сайта уделяется мало внимания.
В предыдущих статьях я указывал на использование файла .htaccess для настройки сообщений об ошибках и индексации директорий. Эту статью я решил написать, чтобы собрать все способы защиты сайта в одном месте. Безопасность сайта заключается в усложнении процесса взлома для хакера и преграда с использованием .htaccess будет в плюс к защите. Надеюсь, что для вас информация будет полезной.
Итак, приступим.
Создаем .htaccess
.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]
Естественно вместо 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 и располагается в корневой директории. Теперь, при доступе к защищенной директории пользователь увидит:
Обратите внимание на предупреждение, что пароль будет передаваться в незашифрованном виде. Это значит, что при определенных обстоятельствах он может быть перехвачен. Не используйте данный вид аутентификации для защиты чрезвычайно важных данных.
Защита файлов от скачивания (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 на свой сайт.
Компания http://serenity.su предлагает комплексное продвижение сайтов в поисковых системах и социальных медиа. Вы можете заказать продвижение сайта в Москве или Санкт-Петербурге по выгодной цене. Также Серенити предлагает услуги разработи сайтов и фирменного стиля.