MYSQL / PHP - Защита от автоматического приведения / преобразования строки в число - PullRequest
0 голосов
/ 10 октября 2019

У меня есть orders таблица с order_id int(11) в качестве PK.

Пользователь вводит order_id, и я передаю его в MySql через

... WHERE order_id = ".db_input($order_id)."

Результирующий SQLследующим образом:

SELECT * 
FROM oc_order 
WHERE `order_id` = '16garbage' 

Возвращает запись с номером заказа 16!

ПОЧЕМУ это делает? '16garbage' НИКОГДА не может быть равен целому числу 16!

Как это исправить?

UPDATE # 1 : это не имеет ничего общего с db_input. Забудь об этом. Он имеет все, что связано с EQUALITY order_id = '16garbage'.

Как сказал Рэймонд Нейланд ниже:

"... внутренний запрос выполняется как select * from oc_order WHEREorder_id = CAST ('16garbage' AS UNSIGNED) из-за автоматического приведения типа данных. "

1 Ответ

0 голосов
/ 10 октября 2019

Единственный способ избежать этого:
Если вы уже знаете, что order_id вашей таблицы имеет тип INT, то мы должны убедиться, что когда $ order_id преобразован в INT, он соответствует пользовательскому вводу!

if ((strval((int)$order_id)) !== $order_id) {$order_id='';}

Команда преобразует $ order_id в int, а затем обратно в строку и проверяет, является ли полученная строка точной строкой, предоставленной пользователем.
Если нет, то мы знаем, что автоматическое преобразование имело место и испортило ввод пользователя.
В этом случае мы уничтожаем пользовательский ввод, чтобы он не возвращал данные, не предназначенные для этого пользователя.

Если мы добавим это до того, как создадим наш SQL:
, если пользователь введет '16garbage', $ order_id станет' '.
, если пользователь введет' 16 ', $ order_id останется' 16 '.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...