java - 准备好的语句会防止sql注入(inject)攻击吗?

标签 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
}

这个用户名实际上来自客户端,用户可以篡改数据(如果他愿意的话)。 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/

相关文章:

java - RandomWalk.java 卡住了

security - 通过 HTTP 发送 Web 表单例份验证数据的最佳方式是什么?

c# - 有没有 "single line"方式生成加密字符串?

php - 使用 secret HTTP header 保护管理面板 - 这是愚蠢的吗?

javascript - 防止 Node.js 中的 SQL 注入(inject)

java - Tomcat无法通过JDBC连接器连接到mysql

java - JVM如何保证finally block 的执行?

Java Hibernate将对象保存在一个数据库中的不同模式中

php - SQL 注入(inject)保护 - 单引号

python - 使用列作为变量时防止 sql "injection"的最佳方法