假设我正在使用PreparedStatement并将用户输入直接传递给它。它可以导致SQLi吗?
我查看了其他stackoverflow答案,但没有人解释这一点
例如
String q = '%' + request.getParameter("search") + '%';
PreparedStatement s = s("SELECT * FROM table_name where search="+q);
ResultSet r = s.executeQuery();
在这种情况下,我们可以看到没有使用?
或setString
。这样的代码可以导致SQLI吗?
是。攻击者可以将搜索参数设置为; DELETE FROM users;
。您准备好的语句调用无法知道您传递给它的SQL不是您打算运行的,因为您在调用之前构建了字符串。
每次连接用户提供的字符串以构建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资源进行操作。