Spec-Zone .ru
спецификации, руководства, описания, API
|
Приложения, что MySQL доступа не должен доверять никаким данным, вводимым пользователями, которые могут
попытаться обмануть Ваш код, входя особенный или вышли из символьных последовательностей в Веб-формах, URL, или
безотносительно приложения, которое Вы создали. Убедитесь, что Ваше приложение остается безопасным, если
пользователь вводит что-то как"; DROP
DATABASE mysql;
". Это - экстремальный пример, но большие утечки безопасности и
потеря данных могли бы произойти в результате хакеров, использующих подобные методы, если Вы не готовитесь к
ним.
Частая ошибка состоит в том, чтобы защитить только строковые значения данных. Не забудьте проверять числовые
данные также. Если приложение генерирует запрос такой как SELECT * FROM table WHERE
ID=234
когда пользователь вводит значение 234
, пользователь может ввести
значение 234 OR 1=1
заставить приложение генерировать запрос SELECT
* FROM table WHERE ID=234 OR 1=1
. В результате сервер получает каждую строку в таблице. Это
представляет каждую строку и вызывает чрезмерную загрузку сервера. Самый простой способ защитить от этого типа
атаки состоит в том, чтобы использовать единственные кавычки вокруг числовых констант: SELECT
* FROM table WHERE ID='234'
. Если пользователь вводит дополнительную информацию, все это становится
частью строки. В числовом контексте MySQL автоматически преобразовывает эту строку в число и разделяет любые
запаздывающие нечисловые символы от нее.
Иногда люди думают, что, если база данных содержит только публично доступные данные, она не должна быть защищена. Это является неправильным. Даже если допустимо вывести на экран какую-либо строку в базе данных, следует все еще защитить от атак "отказ в обслуживании" (например, те, которые основаны на методе в предыдущем абзаце, который заставляет сервер тратить впустую ресурсы). Иначе, Ваш сервер становится безразличным законным пользователям.
Контрольный список:
Позвольте строгому режиму SQL сказать серверу быть более рестриктивным, каких значений данных это принимает. См. Раздел 5.1.7, "Режимы SQL Сервера".
Попытайтесь ввести единственные и двойные кавычки ("'
"и""
") во всех Ваших Веб-формах.
Если Вы получаете какой-либо вид ошибки MySQL, исследуете проблему сразу же.
Попытайтесь изменить динамические URL, добавляя %22
(""
"),
%23
("#
"), и %27
("'
") им.
Попытайтесь изменить типы данных в динамических URL от числового до символьных типов, используя символы, показанные в предыдущих примерах. Ваше приложение должно быть безопасным против этих и подобных атак.
Попытайтесь ввести символы, пробелы, и специальные символы, а не числа в числовых полях. Ваше приложение должно удалить их прежде, чем передать их к MySQL или иначе генерировать ошибку. Передача значений непроверенных к MySQL очень опасна!
Проверьте размер данных прежде, чем передать это к MySQL.
Имейте свое приложение, соединяются с базой данных, используя имя пользователя, отличающееся от того, который Вы используете в административных целях. Не давайте Вашим приложениям права доступа, в которых они не нуждаются.
Много прикладных программных интерфейсов обеспечивают средство выхода из специальных символов в значениях данных. Должным образом используемый, это препятствует тому, чтобы пользователи приложения ввели значения, которые заставляют приложение генерировать операторы, которые имеют различный эффект, чем Вы предназначаете:
API MySQL C: Используйте mysql_real_escape_string()
Вызов API.
MySQL ++: Используйте escape
и quote
модификаторы для потоков запроса.
PHP: Используйте любого mysqli
или pdo_mysql
расширения, а не более старое ext/mysql
расширение. Поддержка привилегированного API улучшенный протокол
аутентификации MySQL и пароли, так же как подготовленные операторы с заполнителями. См. также Раздел 22.9.1.3, "Выбирая API".
Если более старое ext/mysql
расширение должно использоваться, затем для
того, чтобы выйти из использования mysql_real_escape_string()
функционируйте и нет mysql_escape_string()
или addslashes()
потому что только mysql_real_escape_string()
осведомлено о наборе символов; другие
функции могут "обойтись" при
использовании (недопустимых) многобайтовых наборов символов.
Perl DBI: Используйте заполнителей или quote()
метод.
Ruby DBI: Используйте заполнителей или quote()
метод.
Java JDBC: Используйте a PreparedStatement
объектные и
заполнители.
У других интерфейсов программирования могли бы быть подобные возможности.