Как указывает @pilcrow, mysql_query
будет принимать только одно утверждение.Ваш пример на самом деле состоит из двух операторов:
INSERT INTO COMMENTS VALUES('122','value');
и:
DELETE FROM users;
API PHP mysql
немедленно отклонит это, поэтому вы не можете использовать это для проверки внедрения SQL.
Другая проблема с утверждением - использование символов комментария. Синтаксис комментариев MySQL гласит:
От последовательности «-» до конца строки.В MySQL стиль комментария «-» (двойная черта) требует, чтобы за второй чертой следовал хотя бы один пробел или управляющий символ (например, пробел, табуляция, новая строка и т. Д.).Этот синтаксис немного отличается от стандартного синтаксиса комментариев SQL, как обсуждалось в разделе 1.8.5.5, «'- как начало комментария».
Таким образом, после * 1019 у вас должен быть пробел.*.Если вместо этого вы используете #
, то следующие пробелы не требуются.
Более простой и безопасный способ начать тестирование SQL-инъекций - попробовать простой SELECT:
$value = "1' OR 1; -- ";
$sql = "SELECT * FROM mytable WHERE id = '$value'";
print "$sql\n";
// SELECT * FROM mytable WHERE id = '1' OR 1; #'
$result = mysql_query($sql,$con);
// Should return multiple rows (if your table has multiple rows):
while ($row = mysql_fetch_assoc($result)) {
print "{$row['id']}\n";
}
Как PHPmysql
API отклоняет несколько операторов, некоторые из наиболее часто используемых примеров SQL-инъекций не будут работать, и это хорошо.Однако, как вы можете видеть из приведенного выше простого примера, он не мешает другим формам внедрения SQL.
Подумайте, как можно повлиять на подобное утверждение:
DELETE FROM mytable WHERE id = '1'
Также неситепомните, что удаление данных, вероятно, не очень полезно для кого-либо, кроме злоумышленника, который просто хочет вызвать сбои.С другой стороны, получение конфиденциальных данных, к которым у вас нет доступа, может быть очень полезным.