MySQL защита от инъекций и признаки уязвимости с использованием PHP - PullRequest
8 голосов
/ 13 февраля 2009

Каковы наилучшие способы защиты от внедрения MySQL? На какие недостатки мне стоит обратить внимание?

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

Есть ли надежный способ остановить кого-то?

Кстати ... я пишу в PHP:)

Ответы [ 7 ]

15 голосов
/ 13 февраля 2009

Используйте подготовленные операторы вместо того, чтобы смешивать оператор и фактические данные полезной нагрузки.

см.

Вас также могут заинтересовать http://shiflett.org/articles/sql-injection и http://shiflett.org/blog/2007/sep/the-unexpected-sql-injection

8 голосов
/ 13 февраля 2009

Никому не верь!

Очистить все входные данные - filter_var() или регулярные выражения или in_array() допустимых значений или смешанная стратегия в зависимости от типа данных.

«Ввод» означает любой источник ввода, который вы не контролируете напрямую - не только формы!

Санируйте все, что вы получите от $_GET, $_POST, $_SESSION, $_COOKIE - все, что может быть испорчено.

И

Использовать подготовленные высказывания

1 голос
/ 13 февраля 2009

Это может показаться здравым смыслом, но я на некоторое время запутался.

Существует разница между кодировкой htmlentities() и , экранирующей mysql_real_escape_string(). Я думал о них как о довольно взаимозаменяемом. Однако нет ... как здравый смысл скажет вам. :) Обычно лучше применять их оба, например сначала кодировать, а затем экранировать.

Затем при извлечении данных происходит обратный процесс, unescape (если необходимо), затем unencode. Обратите внимание, что конкретный способ выполнения шагов (и обратный) избавит от множества головных болей и двойных проблем.

1 голос
/ 13 февраля 2009

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

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

$age = (int)$age;

Также, если предполагается, что столбец ограничен одним или двумя значениями (например, столбцом пола), убедитесь, что вы применяете это в своем PHP, прежде чем поместить его в базу данных.

1 голос
/ 13 февраля 2009

Вы должны очистить все входные данные. Как вы можете это сделать, зависит от языка программирования и / или среды, с которой вы работаете.

редактирование:

Если вы используете php, то функция, которую вы ищете - mysql_real_escape_string ($ string). Вы должны использовать это на всем, что вы получаете от клиента, который должен идти в базе данных.

0 голосов
/ 13 февраля 2009

Я использую эту функцию PHP на всех входах, прежде чем пытаться использовать ее в любом коде (запрос MySQL, отображение данных и т. Д.). Возможно, он не завершен, но он должен остановить все основные попытки взлома системы:

//$linkID is the link ID of the connection to the MySQL database
function clean_input($input)
{
    GLOBAL $linkID;
    if(get_magic_quotes_gpc())
    {
        //Remove slashes that were used to escape characters in post.
        $input = stripslashes($input);
    }
    //Remove ALL HTML tags to prevent XSS and abuse of the system.
    $input = strip_tags($input);
    //Escape the string for insertion into a MySQL query, and return it.
    return mysql_real_escape_string($input,$linkID);
}
0 голосов
/ 13 февраля 2009

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

Например, вы спрашиваете их имя пользователя. Если вы возьмете его, а затем просто скажите

"Выбрать * из пользователей, где имя пользователя = '$ USERNAME';"

Затем пользователь может добавить «JOE»; Drop Table ... »и т. Д.

В Perl вы можете сказать что-то вроде

my $sth2 = $dbh->prepare("Insert Into HostList (HostName,PollTime,Status) values (?,?,?);");
$sth2->execute($Hostname,$myDate,$Status);

Затем метод execute будет искать эксплойты, подобные приведенному выше, и корректно их избегать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...