Статьи ⇒ PHP ⇒ Пишем безопасный код на PHP. Часть 2

Пишем безопасный код на PHP. Часть 2

Опубликовано: 13 сен 2011 в 15:01
Автор: Dave Child  Перевод: freeeeez 

Эта вторая статья из серии Пишем безопасный код на PHP. В первой части я раскрыл некоторые из наиболее распространенных уязвимостей в веб-сайтах. Пришло время двигаться дальше. Так как методы взлома сайтов постоянно совершенствуются, методы защиты от взлома тоже должны становиться более совершенными.

Пишем безопасный код на PHP представляет собой серию статей.
Читайте также Часть 1, Часть 3 и Часть 4.

Файловые системы

Большинство хостингов, как и большинство веб-разработчиков, очень предсказуемы. Довольно часто веб-сайты имеют каталоги общих файлов, вроде www.website.com/includes/. Если владелец сайта разместит такой каталог на сервере, любой желающий сможет просматривать файлы из этого каталога.

Многие разработчики создают сценарий подключения к базе данных и называют его connect.inc. Все это очень предсказуемо и не безопасно, ведь файлы с расширением .inc обрабатываются браузером как обычный текст, поэтому любой сможет их прочитать! Не используйте файлы с таким расширением для хранения паролей к базам данных. Если же это необходимо, используйте расширение .inc.php, тогда файл будет обработан как php-скрипт (пользователь не увидит выведенного на страницу текста). Кроме всего вышеперечисленного, нужные директории следует запретить от индексации мета-тегом или через файл .htaccess.
 

Администрирование сайта

Большинство владельцев сайтов в настоящее время управляют своими проектами через специальные интерфейсы – CMS (система управления контентом), так что многие и не знают как пользоваться FTP клиентом. Часто этот интерфейс размещается в предсказуемых местах (как было описано в предыдущей статье) и его легко найти. Однако размещение админки в труднодоступном месте не достаточно для полной безопасности.

Злоумышленники прибегают к взлому административной части сайта через атаки грубой силы (полный перебор паролей). Перебор паролей по словарю предполагает подстановку всех паролей до первого совпадения. Такой перебор выполняется через специальные программы (brute force).

Лучшим способом защиты от этого будет комбинированный метод. Во-первых, используйте тест Тьюринга (капча). Следует использовать символы различной высоты и искривленности с добавлением цветового шума. Убедитесь, что эта капча не будет взломана с помощью скрипта оптического распознавания символов.

Во-вторых, добавьте простой счетчик логинов. Если пользователь ввел неправильный пароль больше 10 раз, блокируйте его аккаунт на 4 часа. Эта предосторожность не будет сильно мешать вашим пользователям, но убережет вас от атак грубой силы.

Наконец, отслеживайте множественные попытки входа с одного IP-адреса. Если вы обнаружили такое, вы можете рассмотреть полную блокировку данного IP-адреса.

Параметры базы данных

Настройте свою базу данных так, чтобы ограничить возможности пользователей. Таким образом, вы сможете уменьшить предполагаемый ущерб от их действий. Современные базы данных, такие как MySQL или SQL Server, позволяют контролировать действия пользователей. Вы можете наделить пользователей правами добавления, редактирования, удаления и многими другими. Обычно для многих проектов достаточно позволить пользователям добавлять и редактировать данные.

Служебные команды PHP

Язык PHP содержит множество команд, имеющих доступ к операционной системе сервера, которые могут взаимодействовать с другими программами. Если у вас нет необходимости использовать эти команды, настоятельно рекомендую отключить их.

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

Есть способы, чтобы обойти эту проблему. Не используйте eval() и другие системные функции. Для этого в php.ini есть директива "disable_functions". По умолчанию отключены следующие функции: ini_set(), exec(), fopen(), popen(), passthru(), readfile(), file(), shell_exec() and system().

Бдительность

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

Тэги:  •  •  •  • 
Нет комментариев
5 344 просмотра


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

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

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

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

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