Эта хранимая процедура MySQL все еще подвержена риску внедрения SQL, если она использует подготовленные операторы? - PullRequest
0 голосов
/ 11 октября 2019

Я довольно новичок в MySQL, и я искал столько, сколько смог, но я надеялся, что кто-нибудь может дать мне точный ответ.

Я смотрел на проблемы схранимая процедура в моей базе данных MySQL. Он принимает единственный строковый параметр из внешнего источника в качестве поискового значения и возвращает результаты на основании этого. Однако всякий раз, когда вводится символ '(одинарная кавычка / апостроф), он возвращает ошибку. Заглядывая в это, мне посоветовали, что SP, как он есть, уязвим для инъекций SQL, и что, решая, проблемы с одинарной кавычкой будут решены. Это хранимая процедура:

BEGIN
SET @t1=CONCAT("SELECT `ID` as `Id`, `NAME` as `Name` FROM SEARCH_TABLE WHERE `NAME` like","'",searchString,"%'"," LIMIT 20");
    PREPARE stmt3 FROM @t1;
    EXECUTE stmt3;
    DEALLOCATE PREPARE stmt3;
END

Все, на что я смотрел, говорит о том, что лучший способ избежать внедрения SQL-кода - это использовать подготовленные операторы, так что это все еще под угрозой? Кроме того, чтобы решить проблему с одинарной кавычкой, я видел рекомендации по добавлению еще одной одинарной кавычки, где бы она ни была напечатана (поэтому «станет»). Это лучший способ исправить ошибку?

Спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Пока вы используете подготовленный оператор, вы не используете позиционные заполнители ? для переменной части вашего оператора. Следовательно, ваш запрос на выбор, как вы его написали, все еще подвержен внедрению SQL. Вот обновленная версия:

BEGIN
SET @t1 = CONCAT('SELECT ID AS Id, NAME AS Name, FROM SEARCH_TABLE WHERE NAME LIKE ? LIMIT 20');
PREPARE stmt1 FROM @t1;
SET @a = CONCAT('%', searchString, '%');  -- assuming searchString is defined somewhere
EXECUTE stmt1 USING @a;

Мы связываем %?%, используя функцию CONCAT(), и обратите внимание, что заполнитель LIKE это просто один ?. Кроме того, в вашем запросе в идеале должно быть предложение ORDER BY, если предполагается, что он использует LIMIT.

1 голос
/ 11 октября 2019

Да, ваш код открыт для внедрения SQL, потому что подготовленный оператор содержит введенные пользователем входные данные конкатенированными как есть. Предполагая, что searchString содержит строку ' OR '%' = ', тогда это:

SET @t1=CONCAT("SELECT `ID` as `Id`, `NAME` as `Name` FROM SEARCH_TABLE WHERE `NAME` like","'",searchString,"%'"," LIMIT 20");

Результатом будет:

SELECT `ID` as `Id`, `NAME` as `Name` FROM SEARCH_TABLE WHERE `NAME` like'' OR '%' = '%' LIMIT 20

Это позволит кому-то передать произвольное предложение where. Кроме того, один ' в пользовательском вводе прервет запрос.

...