如果在没有setString的情况下使用PreparedStatement,是否可以获得SQL注入?

问题描述 投票:0回答:2

假设我正在使用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
2个回答
0
投票

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


0
投票

每次连接用户提供的字符串以构建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来正确地对qzxswpoi JDBC资源进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.