В последнее время я кодировал свой веб-сайт на PHP и очень гордился собой за свои передовые методы очистки ввода перед тем, как использовать его в запросе. Все шло отлично, пока мой друг не сказал, что мне нужно очистить свой ввод. Когда я попытался объяснить ему, что он был продезинфицирован, он показал мне, что нашел все в таблице «пользователи» в моей базе данных. Я не знал, как это сделать, поэтому подумал, что опубликую то, что я делал неправильно, из-за чего моя дезинфекция не работала. Вот код PHP, который он использовал:
start_mysql(); // Starts the databases stuff, etc.
$id = mysql_real_escape_string($_GET['id']);
$game = mysql_query("SELECT * FROM `games` WHERE `id` = $id LIMIT 0, 1");
Все, что он делал, это менял параметр id, давая ему возможность использовать SQL-инъекцию в моей базе данных. Я думал, что mysql_real_escape_string экранирует все подобные символы, но, видимо, я ошибался. Я провел несколько тестов с обычной строкой, чтобы увидеть, что произойдет, и вот что там написано
URL: /game.php?id= 'OR' '='
echo($_GET['id']); // This echo'd: \' OR \'\' = \'
echo(mysql_real_escape_string($_GET['id'])); // This echo'd: \\\' OR \\\'\\\' = \\\'
Итак, мой простой вопрос: что я Я делаю что-то не так?