mysql — SQL-инъекция в LIMIT (из PHP)

У меня есть следующий код:

$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 (), чтобы убедиться, что это целое число. Мой главный вопрос — ПОЧЕМУ … Почему это работает? Я действительно не понимаю.

Большое спасибо за ваши идеи.

1

Решение

Вы должны разобрать это в целое число.

$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 рассматривает все как строку и просто делает ее безопасной.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector