|
|
Безопасность разработки приложений на основе PHP и MySQL.
Здравствуйте, уважаемые читатели статьи "Проблемы безопасности при разработке web-приложений на основе PHP+MySQL". Данная статья посвящена безопасной настройке MySQL в расчете на работу совместно c PHP. Не смотря на то, что основной "стержень" безопасности в MySQL составляет механизм управления привилегиями, рассмотрим, для начала, параметры конфигурации PHP и MySQL, прямо относящиеся к теме. Итак, файл конфигурации PHP (php.ini), секция [MySQL]: Интересующие нас параметры mysql.default_host, mysql.default_user и mysql.default_password. Предназначены они для установки хоста, пользователя и пароля по умолчанию при подключении к базе из PHP. Следовательно, если параметры установлены, любой скрипт, запущенный на хосте может подключиться к базе без необходимости передачи авторизационных параметров, просто выполнив mysql_connect(). Если этот скрипт Ваш - удобно и никакой возни. А если нет? В таком случае злоумышленник получит доступ к базе, и узнает о ней все необходимые данные. Как это не странно, установка параметров авторизации в файле конфигурации PHP встречается довольно часто. Несомненно, это серьезная ошибка и "дыра" в безопасности. Гораздо более правильным выглядит давно проверенный способ подключения к базе, использующий включаемый файл, содержащий всю последовательность подключения. Подразумевается наличие файла, например base.inc.php, расположенного, например, в каталоге /Include и содержащего примерно такой код (упрощенно): $DBConnect = mysql_connect([имя хоста], [имя пользователя], [пароль]) or die ("Ошибка!"); $DBSelect = mysql_select_db ([имя базы данных]) or die ("Ошибка!"); Теперь, расположив в начале любого php-скрипта функцию включения файла base.inc.php (include "[путь]/base.inc.php";), мы обеспечим относительно безопасное соединение с базой MySQL. Разумеется, каталог, где расположены включаемые файлы и сами файлы должны быть недоступны извне. Еще раз повторим, что установка параметров авторизации при подключении к базе (к абсолютно любой) в конфигурации PHP недопустимо. Перейдем к работе с привилегиями доступа, информация о которых, по умолчанию, содержится в базе mysql каждого сервера. Интересующими нас таблицами в базе mysql, для начала, будут являться user, db и host. Таблица user, как не трудно догадаться, содержит глобальные привилегии пользователей. Краткое описание полей таблицы: Host - имя хоста, с которого данный пользователь может осуществить соединение. Если соединение с других хостов в нашем проекте не предусмотрено, имя хоста для всех пользователей должно быть равно имени хоста проекта. В случае если данное поле равно "%" (символ процента), доступ для данного пользователя возможен с любого хоста. С точки зрения безопасности, ни один пользователь базы не должен иметь права доступа с любого хоста. User - Имя данного пользователя. Password - Пароль данного пользователя в зашифрованном виде. Полагаю, напоминать о том, что пароль должен содержать минимум 8 символов и состоять из хаотичного набора цифр, букв в обоих регистрах и разрешенных символов, нет необходимости. Далее следуют поля, отвечающие за возможность данного пользователя выполнять те или иные команды. Например, расположенный в поле_priv символ "Y" разрешает данному пользователю выполнение в запросе команды. Далее - по аналогии. Следующие за полями привилегий поля отвечают за тип и параметры SSL соединения данного пользователя и количественные ограничения, включающие максимально возможные число запросов (max_questions), число обновлений (max_updates) и соединений (max_connections и max_user_connections). Привилегии, описанные для пользователя в таблице user, распространяются на все базы и таблицы. Далее мы будем говорить о том, что для безопасной работы web-приложения необходимо наличие нескольких пользователей базы данных с разными правами для разных баз и таблиц. Следовательно, иметь разрешение на выполнение команд в таблице user должен только пользователь root. В идеале, PHP скрипты вообще не должны использовать соединение с базой под root`ом. Таблица db содержит привилегии пользователей относительно каждой базы данных. Структура её аналогична структуре таблицы user за тем лишь отличием, что вместо поля Password присутствует поле Db, содержащее имя базы данных, для которой в записи описываются привилегии. Во многих случаях существует смысл создать несколько пользователей, имеющих разные права доступа к одной и той же базе. Соответственно, если скрипт намеревается только читать данные из базы, он соединяется под соответствующим пользователем, который имеет привилегии только на чтение из этой базы (разрешено, например, только_priv). Таблица host также имеет аналогичную структуру с вышеописанными таблицами и отвечает за привилегии хостов в доступе к базе. Напомним, что во всех настройках привилегий, необходимо явно указывать имя хоста для того или иного пользователя. Разрешение соединения с любого хоста для любого, пусть самого ограниченного в правах пользователя, недопустимо. Таблица tables_priv тоже не несет для нас ничего нового. Она отвечает за распределение прав в каждой отдельной таблице базы. Организация распределения доступа по таблицам является более сложной задачей, чем работа с ограничением по базам, однако позволяет еще более повысить уровень безопасности в данном направлении. Что дает такое, казалось бы, явное усложнение распределения прав доступа к базе для PHP-скриптов? Единственная цель - ограничить права работы с базой скрипта, в случае использования злоумышленником атак вроде MySQL-Injection. Даже если все наши проверки и валидации входящих данных, о которых мы будем говорить в следующих выпусках, не сработают и, некто сможет отправить запрос к базе по средствам какого либо скрипта на сайте, возможности этого "некто" будут ограничены привилегиями того пользователя, через которого данный скрипт соединяется с базой. Итак, в заключении второго выпуска кратко повторим те базовые принципы, которые должны быть использованы при разработке любого более-менее серьезного проекта, использующего MySQL: 1. Никогда не устанавливаем логин и пароль базы по умолчанию в конфигурационных файлах. Храним их в отдельном файле(ах), недоступном извне, и "инклудим" в начале скрипта(ов). 2. Скрипты не должны соединяться под root`ом или любым другим пользователем имеющим обширные права. Пользователя с именем "%" удаляем сразу (если есть). 3. Если на хосте, помимо основного ПО, предполагается работа скрипта стороннего разработчика (форум, галерея и т.д.) всегда создаем для каждой из таких систем отдельного пользователя с доступом только к базе этой и никакой другой системы. 4. Никогда не используем учетные данные пользователей базы, подразумевающие соединение с любого хоста. Имя хоста всегда явно прописано для каждого пользователя. 5. Проведя анализ разрабатываемой системы, определяется несколько учетных записей пользователей базы, имеющих разные права и области действия. Для скрипта (или его части), который не нуждается в операциях добавления или изменения (INSERT,:), а только считывает данные, соединение производится под соответствующим пользователем, неиспользуемые операции для которого запрещены. 6. Как правило, для большинства проектов, используемых пользователей, имеющих права на операции создания новых таблиц/баз, удаления таблиц/баз, работы с пользователями и технических операций быть не должно. Сегодня мы определили ряд классических базовых правил, которые, искренне надеемся, будут более-менее понятны всем подписчикам. Разумеется, это лишь самая верхушка айсберга технологий обеспечения безопасной настройки PHP+MySQL, прикладной, так сказать, уровень. Однако, даже соблюдение этих тривиальных принципов позволит разработчику на порядок снизить суммарную уязвимость проекта любого масштаба. С уважением, и наилучшими пожеланиями, Группа разработки WebDev Systems. http://www.webdevsystems.ru |
|
![]() Каталог | Мои закладки | О проекте | Правила | Регистрация | Карта каталога | Контакты |
|