准备好的语句会阻止sql注入攻击吗?

nib*_*012 5 java security sql-injection

考虑一个假设的情况,我必须根据userId从数据库中检索一些细节,下面给出了示例代码

private String getpassword(String username) {

PreparedStatement statement = null;
ResultSet resultSet = null;
Connection conn = null;

final String selectQuery = "SELECT password FROM " + "users WHERE username=?";
try {
    conn = dataSource.getConnection();
    statement = conn.prepareStatement(selectQuery);
    statement.setString(1, username);
    resultSet = statement.executeQuery();
    if (resultSet.next()) {
        }

} catch (SQLException e) {
 // log it
}
//return
}
Run Code Online (Sandbox Code Playgroud)

此用户名实际上来自客户端,用户可以篡改数据(如果他愿意).因此,preparedStatements将阻止接受引号并仅将过滤后的SQL形式发送到数据库.

例如:我可以提供username ='或1 = 1,它将是一个有效的SQL语句.但是如果驱动程序从用户输入中删除引号,那么它们将阻止sql注入.

对此一般的理解是什么?

Tho*_*mas 4

据此,是的:http: //en.wikipedia.org/wiki/SQL_injection

在这种情况下,该语句已经编译,并且注入的代码将不会再次被解释(因此不会被执行)。