При использовании Unix-подобной операционной системы запуск сервера MySQL (ьныйдв) в качестве привлегированного процесса — не самая лучшая идея. В этом случае пользователь MySQL получает полный набор полномочий для выполнения чтения и записи файлов в любом каталоге операционной системы. Это исключительно важный момент, который легко упустить из виду.
Имеет смысл настроить пользователя MySQL специально для запуска mysqld. Кроме того, доступ к каталогам (в которых храняться физические данные) можно разрешить только пользователю MySQL. Dj многих установках сервер настраивается так, чтобы он запускался с идентификатором пользователя mysql? входящего в состав группы mysql.
В идеале следует также помещать сервер MySQL позади брандмауэра. Тем самым можно предотвратить подключение с компьютеров, не обладающих соответствующими полномочиями. Следует проверить, возможно ли внешнее подключение к серверу через порт 3306. Через этот порт сервер MySQL действует по умолчанию, и он должен быть закрыт брандмауэром.
Убедитесь, что все пользователи (особенно root!) имеют парли, и что эти пароли правильно выбраны и регулярно обновляются, подобно паролям операционной системы. При этом важно помнить, сто использование паролей, которые представляют собой или содержат слова из какого-либо словаря — идея весьма неудачная. Лучше всего применять комбинации букв и цифр.
Если планируете хранить пароли в файлах сценариев, убедитесь, что каждый из таких сценариев доступен только тому пользователю, чей пароль хранится в данном файле.
PHP-сценариям, служащим для подключения к базе данных, требуется доступ к паролю конкретного пользователя. Это можно сделать достаточно безопасно, помещая имя учетной записи и пароль пользователя в файл, названный, например, dbcoonnect.php , который затем можно включить в программу при необходимости. Этот сценарий можно надежно хранить вне дерева веб-документов, предоставляя доступ к нему только соответствующему пользователю.
Помните, что при помещении этих сведений в файл с раширением .inc или каким-либо другим расширением в дереве веб-документов, следует тщательно проверить, что веб-сервер будет интерпретировать их как PHP-сценарии, не разрешая просмотр этих сведений в веб-браузере.
Пароли не следует хранить в виде обычного текста в базе данных. Пароли MySQL не храняться в таком виде, но в веб-приложениях часто требуется хранить также имена учетных записей и пароли членов веб-сайта. Шифрование паролей (однонаправленное) можно выполнить с помощью MySQL-функции SHA1(). Помните, что в случае вставки пароля, представленного в этом формате, с помощью оператора SELECT (например, для регистрации пользователя), эту же функцию придется вызывать еще раз для проверки пароля, введенного пользователем.
Необходимо хорошо понимать особенности работы системы полномочий MySQL и последствия выдачи конкретных полномочий. Ни одному пользователю не следует предоставлять больше полномочий, чем ему требуется. Эти полномочия необходимо проверять, просматривая таблицы полномочий.
В частности, не выдавайте полномочия PROCESS, FILE, SHUTDOWN, RELOAD ни одному пользователю кроме администратора, если это только не абсолютно необходимо. Полномочия PROCESS могут быть использованы для слежения за тем, что делают и вводят пользователи, в том числе за вводом паролей. Полномочия FILE позволяют считывать и записывать файлы операционной системы (в числе которых, например, файл /etc/password в системе Unix).
Полномочия GRANT также должны предоставляться с осторожностью, поскольку они разрешают пользователям делиться своми полномочиями с другими.
При определении пользователей предоставляйте им доступ только их тех хостов, с которых они будут подключаться к базе данных Если у вас есть пользователь alecs@localhost —это хорошо, но alecs —достаточно распространенное имя, и пользователь с таким именем может входить в систему откуда угодно — при этом проверить футентичность alecs не предоставляется возможным. По аналогичным причинам следует избегать применения групповых символов в именах хостов.
Безопасность можно еще увеличить, если указать в таблице host IP-адреса, а не имена доменов. Это позволяет избежать проблем, связанных с ошибками ввода или атаками на сервер DNS. Данный подход можно реализовать, запустив демон MySQL с параметром --skip-name-resolve, который означает, что все значения столбца хоста должны быть либо IP-адресами, либо именем локального узла.
Следует также запретить пользователям, которые не являются администраторами доступ к программе mysqladmin на веб-сервере. Поскольку эта программа запускается из командной строки, наличие доступа к ней по существу означает наличие полномочий доступа к операционной системе.
Подключение базы данных MySQL к веб порождает несколько специфических проблемм безопасности.
Неплохо начать с создания пользователя специально для подключения к веб. При этом ему можно выдать минимально необходимые полномочия и не предоставлять такие полномочия как, например, DROP, ALERT, CREATE. Этому пользователю можно было бы выдать полномочия SELECT только для таблиц catalog и полномочия INSERT —только для таблиц order. Приведенный пример —еще одна иллюстрация применения принципа минимальных полномочий.
Предостережение. Ранее было описано использование PHP-функций addslashes() и stripslashes() для удаления из строки сомнительных символов. Перед отправкой любых данных в MySQL важно не забывать о необходимости реализации как этих действий, так и общей "чистки" данных. Следует не забывать об использовании функции doubleval() для проверки того, что числовые данные таковыми являются в действительности. Пропуск этой проверки — часто встречающаяся ошибка.
Проверять все данные, поступающие от пользователя, необходимо всегда. Даже если HTML-форма состоит только из полей выбора и переключателей. Целесообразно также проверять размер поступающих данных.
Если пользователи вводят пароли или конфеденциальные данные, которые должны храниться в базе данных, помниет, что если только не использовать протокол безопасных сокетов (SSL), эти данные будут передаваться из браузера серверу в виде обычного текста. Использование SSL более подробно рассматривается далее.