考虑一个假设情况,我必须根据 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
}
这个用户名实际上来自客户端,用户可以篡改数据(如果他愿意的话)。 preparedStatements 也将阻止接受引号并仅将过滤后的 SQL 形式发送到数据库。
例如:我可以提供 username= ' 或 1=1,这将是一个有效的 SQL 语句。但是如果驱动程序从用户输入中转义引号,那么它们将防止 sql 注入(inject)。
一般的理解是什么?
最佳答案
据此,是:http://en.wikipedia.org/wiki/SQL_injection
在那种情况下,语句已经被编译并且注入(inject)的代码将不会被再次解释(因此不会被执行)。
关于java - 准备好的语句会防止sql注入(inject)攻击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7120647/