У меня есть код java, который вызывает хранимую процедуру и возвращает результат поиска в веб-браузер. Проблема, с которой я сталкиваюсь, заключается в том, что процедура принимает параметры из браузера, теперь даже если я использую PreparedStatement в java пользовательский ввод очищается только для вызова процедуры, но как только переданное значение входит в хранимую процедуру, оно снова становится уязвимым для SQL Injection,
здесь есть фрагмент кода
Java код
stmt=con.prepareStatement("call myProcedure(?,?)");
.
.
rs = stmt.executeQuery();
my mysql Процедура: -
CREATE PROCEDURE myProcedure(IN userinput1 VARCHAR(255), IN unserinput2 VARCHAR(255))
BEGIN
SELECT
*
FROM
myTable
where
col1 = userinput1
and col2 = userinput2
ORDER BY id;
END$$
DELIMITER ;
Теперь я могу решить эту проблему, если перепроектировать свою процедуру следующим образом: -
CREATE PROCEDURE myProcedure(IN userinput1 VARCHAR(255), IN unserinput2 VARCHAR(255))
BEGIN
SET @query = concat(“SELECT * FROM myTable WHERE col1 = ? and col2 = ?“);
SET @a = userinput1;
SET @b = unserinput2;
PREPARE stmt from @query;
EXECUTE stmt using @a, @b;
END$$
DELIMITER ;
Но моя проблема в том, что приложение, над которым я работаю, уже имеет множество процедур и функций, спроектированных как таковые, и я не хочу вводить go и перепроектировать все процедуры по одной.
Есть ли какой-нибудь особый способ, которым я мог бы предварительно санировать ввод перед передачей его самой процедуре.
Кроме того, отфильтровывать ключевые слова SQL нельзя, так как есть несколько кодов, допускающих свободный текст, это старая реализация многоцелевой хранимой процедуры, которая отлично работает в сценарии инъекции.