У меня есть следующий код:
$req = mysql_query("SELECT * FROM table WHERE id='".mysql_real_escape_string($id)."' ORDER BY lastupdate DESC LIMIT ".mysql_real_escape_string($_GET['start']).", 15 ");
По какой-то причине мне кажется, что я могу вставить некоторый (непригодный) код SQL в параметр $ _GET [‘start’].
Например : 1,100 #
(URL закодирован так: +1%2C+100%23
)
Я вполне уверен, что вы не можете использовать его, чтобы нанести какой-либо ущерб или украсть что-либо из моей базы данных (UNION не может работать из-за ORDER BY, а mysql_query () не допускает множественные запросы
Я знаю, что должен добавить intval (), чтобы убедиться, что это целое число. Мой главный вопрос — ПОЧЕМУ … Почему это работает? Я действительно не понимаю.
Большое спасибо за ваши идеи.
Вы должны разобрать это в целое число.
$req = mysql_query("SELECT * FROM table WHERE id='".(int)$id."' ORDER BY lastupdate DESC LIMIT ".(int)$_GET['start'].", 15 ");
Кроме того, вы должны настоятельно рассмотреть возможность использования MySQLi или же PDO
Функции mysql_ *, mysqli_ * не имеют представления о структуре вашей таблицы. Функция mysql_real_escape_string рассматривает все как строку и просто делает ее безопасной.
Других решений пока нет …