Могу ли я сделать SQL-инъекцию в этот код? - PullRequest
2 голосов
/ 28 января 2011

Я все еще учусь внедрению SQL, но всегда лучшим способом для меня было использование примеров, так что это часть моего кода:

$sql = "INSERT INTO `comments` (`id`, `idpost`, `comment`, `datetime`, `author`, `active`) 
        VALUES (NULL, '" . addslashes($_POST['idcomment']) . "', '" . 
        addslashes($_POST['comment']) . "', NOW(), '" . 
        addslashes($_POST['name']) . "', '1');";

  mysql_query($sql);

Зная, что все переменные POST вводятсяПользователь, можете ли вы показать мне, как я могу сделать инъекцию в этот скрипт?так что я могу понять больше об этой уязвимости.Спасибо!

мой сервер баз данных - MySQL.

Ответы [ 4 ]

5 голосов
/ 28 января 2011

Не используйте addslashes(), всегда используйте mysql_real_escape_string().Известны крайние случаи, когда addlashes () недостаточно .

Если вы начинаете что-то новое с нуля, лучше всего использовать оболочку базы данных, которая поддерживает подготовленные операторы, такие как PDO или mysqli.

3 голосов
/ 28 января 2011

Большинство других ответов, похоже, полностью упустили смысл этого вопроса.

Тем не менее, основываясь на вашем примере выше (и, несмотря на то, что ваш код не соответствует рекомендациям mysql_real_escape_string()), я не могу внедрить что-то действительно вредное, когда вы используете addslashes().

Однако, если вы ее опустите, пользователь может ввести в поле name строку, которая выглядит примерно так:

some name'; DROP TABLE comments; --

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

Однако (опять же), насколько я понимаю, MySQL по умолчанию автоматически закрывает соединение с БД в конце выполнения одного оператора. Таким образом, даже если бы я попытался отбросить таблицу, MySQL не смог бы выполнить этот второй оператор.

Но это не единственный тип внедрения SQL, я бы посоветовал прочесть еще немного по этой теме. Мое исследование нашло этот документ на dev.mysql.com, что довольно неплохо: http://dev.mysql.com/tech-resources/articles/guide-to-php-security-ch3.pdf


Правка, еще одна мысль:

В зависимости от того, что происходит с данными, когда они поступают в базу данных, я, возможно, не захочу вообще вводить SQL. Я могу захотеть добавить какой-нибудь HTML / JavaScript, который запускается, когда вы отправляете данные обратно на веб-страницу в атаке Cross-Site Scripting (XSS) . Что тоже нужно знать.

1 голос
/ 28 января 2011

Как уже было сказано, для строк , используйте mysql_real_escape_string () вместо addlashes () , но для целых чисел, используйте intval () .

/* little code cleanup */

$idcomment = intval($_POST['idcomment']);
$comment = mysql_real_escape_string($_POST['comment']);
$name = mysql_real_escape_string($_POST['name']);

$sql = "INSERT INTO comments (idpost, comment, datetime, author, active)
        VALUES ($idcomment, '$comment', NOW(), '$name', 1)";

mysql_query($sql);
0 голосов
/ 29 января 2011

Добавляет косые черты только кавычки.

Но здесь есть еще несколько важных случаев:

Be careful on whether you use double or single quotes when creating the string to be escaped:

$test = 'This is one line\r\nand this is another\r\nand this line has\ta tab';

echo $test;
echo "\r\n\r\n";
echo addslashes($test);

$test = "This is one line\r\nand this is another\r\nand this line has\ta tab";

echo $test;
echo "\r\n\r\n";
echo addslashes($test);

Еще один:

In particular, MySQL wants \n, \r and \x1a escaped which addslashes does NOT do. Therefore relying on addslashes is not a good idea at all and may make your code vulnerable to security risks.

И еще:

Be very careful when using addslashes and stripslashes in combination with regular expression that will be stored in a MySQL database. Especially when the regular expression contain escape characters!

To store a regular expression with escape characters in a MySQL database you use addslashes. For example:

$l_reg_exp = addslashes( �[\x00-\x1F]� );

After this the variable $l_reg_exp will contain: [\\x00-\\x1F].

When you store this regular expression in a MySQL database, the regular expression in the database becomes [\x00-\x1F].

When you retrieve the regular expression from the MySQL database and apply the PHP function stripslashes(), the single backslashes will be gone!

The regular expression will become [x00-x1F] and your regular expression might not work!

Помните, что магия может произойти в:

  • addslashes который может пропустить что-то
  • перед добавлением в базу данных
  • после извлечения из базы данных

Ваш пример - только отрывок. Реальная проблема может быть не видна здесь пока .


(основываясь на комментариях от php.net , которые зачастую более ценны, чем само руководство)

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