我有一个java代码,它调用一个存储过程并将搜索结果返回到Web浏览器,我面临的问题是该过程接受来自浏览器的参数,现在即使我在java中使用PreparedStatement用户输入仅针对过程的调用进行清理,但一旦传递的值进入存储过程,它再次容易受到 SQL 注入(inject)的攻击,
这是代码片段
Java代码
stmt=con.prepareStatement("call myProcedure(?,?)");
.
.
rs = stmt.executeQuery();
我的 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 ;
但我的问题是,我正在开发的应用程序已经有很多这样设计的程序和功能,我不想一一重新设计所有程序。
有没有什么特定的方法可以在将输入传递给过程本身之前对其进行预清理。
此外,过滤掉 SQL 关键字也不是一个选项,因为有多个代码允许自由文本,它是多用途存储过程的旧实现,可以在可注入(inject)场景之外完美运行。
最佳答案
SQL注入(inject),
通常语句中会有SQL关键字,如[“master”,“truncate”,“insert”,“select”,“delete”,“update”,“declare”,“alter”,“drop”],你需要过滤你的参数,如果包含关键字,给浏览器错误提示
关于java - 在将输入作为变量从 java 传递给存储过程之前对其进行清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61135251/