Глава 5. Безопасность

Содержание
Основные положения
При инсталляции в виде приложения CGI
При инсталляции в виде модуля Apache
Безопасность файловой системы
Безопасность баз данных
Отчеты об ошибках
Использование опции register-globals
Данные, отправленные пользователем
Скрытие PHP
В ногу со временем

PHP - это мощный язык программирования и интерпретатор. Будучи интегрированным в виде модуля в Web-сервер, или выполняясь как оддельное CGI-приложение, он может обращаться к файлам, исполнять команды и открывать сетевые соединения на сервере. Эти особенности делают все, что выполняется на Web-сервере, небезопасным. PHP специально разрабатывался для того, чтобы быть более безопасным языком для написания CGI-совместимых программ, нежели Perl или С, и, если правильно выставлены настройки компиляции и выполнения, а также при наличии достаточного опыта программирования, PHP даст вам необходимое соотношение гибкости и безопасности.

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

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

В начале главы даются основные советы по реализации безопасности, объясняются различные комбинации опций настройки и ситуации, в которых они могут быть безопасно использованы. Также приводятся различные соображения по части программирования для разных уровней безопасности.

Основные положения

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

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

Всегда необходимо помнить: система безопасности настолько хороша, насколько безопасно ее самое слабое место. Если, к примеру, ведутся отчеты по всем операциям, времени, месту и т.д., но проверка пользователей осуществляется с использованием одного cookie, то соответствие имен пользователей в отчетах с реальными пользователями весьма и весьма сомнительно.

При отладке помните, что невозможно предугадать все варианты развития событий даже для одной единственной странички. Ожидаемые входные данные могут отличать от введенных недобросовестным работником, хакером с многолетним стажем или просто кошкой, прошедшейся по клавиатуре. Поэтому всегда удобнее подходить к программе с точки зрения логики, чтобы проследить места возможного появления неожиданных данных, а также их использования.

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