【问题标题】:Is it possible to get SQL Injection if PreparedStatement is used without setString?如果在没有 setString 的情况下使用 PreparedStatement,是否可以获得 SQL 注入?
【发布时间】:2019-04-13 02:46:15
【问题描述】:

假设我使用的是 PreparedStatement 并将用户输入直接传递给它。会导致 SQLi 吗?

我查看了其他 stackoverflow 答案,但没有人解释这一点

例如

String q = '%' + request.getParameter("search") + '%';
PreparedStatement s = s("SELECT * FROM table_name where search="+q);
ResultSet r = s.executeQuery();

在这种情况下,我们可以看到没有使用?setString。这样的代码会导致 SQLI 吗?

【问题讨论】:

    标签: java sql prepared-statement


    【解决方案1】:

    是的。攻击者可以将搜索参数设置为; DELETE FROM users;。您的准备好的语句调用无法知道您传递给它的 SQL 不是您打算运行的东西,因为您在调用之前构建了字符串。

    【讨论】:

      【解决方案2】:

      任何时候你连接用户提供的字符串来构建一个 SQL 语句,如果没有充分地转义字符串,你很容易受到 SQL 注入攻击。

      你的代码应该这样写:

      String search = request.getParameter("search");
      
      String sql = "SELECT * FROM table_name WHERE search LIKE ?";
      try (PreparedStatement s = conn.prepareStatement(sql)) {
          s.setString(1, '%' + search + '%');
          try (ResultSet r = s.executeQuery()) {
              // more code here
          }
      }
      

      注意使用LIKE 使通配符正常工作,并使用try-with-resources 正确close() JDBC 资源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-23
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 2018-08-06
        • 2014-06-16
        • 2020-01-22
        相关资源
        最近更新 更多