修复基于 URL 内容的 SQL 注入

to fix URL content based SQL injection

提问人:Anshu 提问时间:2/7/2020 最后编辑:Anshu 更新时间:2/7/2020 访问量:301

问:

我正在尝试修复我的应用程序的 SQL 注入。我用来获取详细信息的 SQL 查询是

"SELECT accountNumber, balance FROM accounts WHERE reg_id = " 
  + request.getParameter("reg_id");

我知道这个查询容易受到攻击,这就是为什么我尝试使用绑定参数来解决此问题的原因,但问题是reg_id字母数字数据以及“-”(连字符作为特殊符号,例如 - 1abh34-dfg465-aw234)并且我无法使用 和 方法来验证reg_id。statement.setInt()statement.setString()

我的问题是,有什么方法可以用来验证字母数字数据吗?

我的 java 代码是

String accountBalanceQuery = 
  "SELECT accountNumber, balance FROM accounts WHERE reg_id = " 
  + request.getParameter("reg_id");

try {
    Statement statement = connection.createStatement();
    ResultSet rs = statement.executeQuery(accountBalanceQuery);
    while (rs.next()) {
        page.addTableRow(rs.getInt("accountNumber"), rs.getFloat("balance"));
    }
} catch (SQLException e) { ... }

或者有没有其他方法可以在没有绑定参数的情况下修复此漏洞。任何这方面的线索将不胜感激。

sql jdbc sql 注入

评论

0赞 2/7/2020
数据库中的数据类型是什么?我看不出有什么理由你不能在这里使用 PreparedStatement。如果它是“字母数字”,那么似乎是一个完美的契合(特别是因为也返回一个字符串)reg_idsetString()getParameter()
0赞 Anshu 2/7/2020
这是一个 varchar。
0赞 2/7/2020
然后你可以使用 - 你认为你不能使用它的原因到底是什么?setString()
0赞 Anshu 2/7/2020
我的应用程序扫描工具在SQL语句后添加&&!sleep(11000)&&&“1。因此,我不确定这是否会使reg_id参数仅用于所需的输入。
1赞 Bill Karwin 2/8/2020
查询参数无法让恶意 SQL 注入攻击通过。查询参数不仅仅是连接字符串的另一种方式,它们将参数与 SQL 查询分开,直到数据库服务器对其进行解析解析 SQL 后,任何恶意内容都无法更改查询的语法。因此,尝试的恶意内容只会导致与任何行都不匹配的查询,而不是执行额外逻辑的查询。

答: 暂无答案