В последнее время я кодировал свой веб-сайт на 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 \\\'\\\' = \\\'
Итак, мой простой вопрос: что я делаю не так?