Безопасен ли этот запрос от внедрения SQL? - PullRequest
10 голосов
/ 14 июня 2010

Скрипт на PHP и в качестве БД я использую MySQL. Вот сам скрипт.

$unsafe_variable = $_GET["user-input"];
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable);
mysql_query($sql);

Некоторые люди говорят, что если пользователь присвоит ;DROP TABLE blah; строку переменной $ unsafe_variable, он удалит таблицу.

Но я попробовал этот пример,

http://localhost/test.php?user-input=DROP%20TABLE%20my_table 

Но он не удалил таблицу, а вставил в нее новую строку (;DROP TABLE blah;).

Может кто-нибудь объяснить мне, как можно атаковать этот скрипт с помощью SQL инъекций?

Ответы [ 8 ]

13 голосов
/ 14 июня 2010

Эта конкретная инъекция не будет работать, поскольку функция PHP mysql_query допускает только один запрос на вызов. Однако, если column имеет первичный или уникальный ключ, может работать следующее:

$unsafe_variable = "admin') ON DUPLICATE KEY UPDATE password=MD5(CONCAT('knownsalt', 'newpassword'))#";

Лучше использовать длинную функцию mysql_real_escape_string:

$sql=sprintf("INSERT INTO table (column) VALUES(%s)",
             mysql_real_escape_string($unsafe_variable));
mysql_query($sql);
4 голосов
/ 14 июня 2010

mysql_query() не позволяет выполнять несколько запросов в одной функции.Таким образом, вы не можете вставлять, а затем бросить стол.Но вы не должны полагаться на это как на «безопасность».Вместо этого используйте параметризованные запросы.Ознакомьтесь с библиотекой PHP PDO .

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

3 голосов
/ 14 июня 2010

Хотя mysql_query позволяет выполнять только один запрос, в целом этот запрос небезопасен. Пример опасного ввода, который может использовать ваш запрос:

'); DROP TABLE my_table; --

'); в начале закроет ваш запрос и вставит пустое значение, но позволит выполнить дополнительные запросы после INSERT. Затем, после удаления таблицы, -- в конце пометит все остальное после (т.е. остальную часть вашего запроса) как комментарий.

Чтобы безопасно подготовить ввод для использования в запросе, используйте mysql_real_escape_string.

2 голосов
/ 14 июня 2010

Единственный способ обработки небезопасных переменных - это параметры связывания.

Пожалуйста, прочитайте эту страницу о том, как предотвратить внедрение SQL из bobby-tables.com .

1 голос
/ 14 июня 2010

Некоторые люди говорят, что если пользователь назначает; DROP TABLE, бла; Строка с переменной $ unsafe_variable удаляет таблицу.

Очевидно, что это не так, но если вы не понимаете, почему, тогда вы не можете сказать, является ли ваш код безопасным. Собираетесь ли вы размещать каждую строку здесь, чтобы проверить, безопасно ли это?

Не вдаваясь в подробное объяснение того, что делает приведенный выше код и как его скомпрометировать (SQL-инъекция уже хорошо документирована в другом месте - попробуйте Google для начала), вы должны ВСЕГДА следить за тем, чтобы любые данные, выходящие из вашего PHP-кода, находились в правильное представление о том, куда он идет.

Для базы данных MySQL это означает:

1) использовать вывод mysql_real_escape_string (и убедитесь, что вы передали правильный дескриптор ресурса)

или

2) использовать привязку параметров.

Правильное обсуждение атак внедрения кода может легко заполнить несколько сотен страниц - немного много, чтобы ответить на S.O. запрос.

С

1 голос
/ 14 июня 2010
mysql_real_escape_string($unsafe_variable)
1 голос
/ 14 июня 2010

Нет, sprintf не избегает использования контента:

$unsafe_variable = mysql_real_escape_string($_GET["user-input"]);
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable);
mysql_query($sql);
0 голосов
/ 14 июня 2010

Я думаю, вам нужно попробовать пример http://localhost/test.php?user-input=';DROP%20TABLE%20my_table'

'); закрывает сегмент values('%s, а затем выдает новую команду, drop table...

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