java - 在将输入作为变量从 java 传递给存储过程之前对其进行清理

标签 java mysql stored-procedures prepared-statement

我有一个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/

相关文章:

php - Laravel 中的四(或五)向表关系

sql - 根据同一表中的行计算 SQL 存储过程中的总计

存储过程中的sql2000循环

java - 我们是否需要测试 cron 作业是否正在运行?或者是否需要 cron 作业的健康检查?

java - 需要澄清 Android 和应用程序架构中的 XML 文件

java - 将字符串数组添加到 ArrayList

mysql获取与年份无关的月份数

java - 当我测试此代码时,交互 Pane 无响应

mysql - SQL 错误 1064 - 导入错误

sql - 防止Sql列溢出