PreparedStatement如何避免或防止SQL注入?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (71)

我知道PreparedStatements可以避免/防止SQL注入。它是怎么做到的?使用PreparedStatement构建的最终表单查询是否为字符串?

提问于
用户回答回答于

SQL注入的问题是,用户输入被用作SQL语句的一部分。通过使用准备好的语句,您可以强制将用户输入作为参数的内容处理(而不是作为SQL命令的一部分)。

但是,如果您不使用用户输入作为准备语句的参数,而是通过将字符串连接在一起来构建sql命令,则仍然容易受到SQL注入的影响。

用户回答回答于

考虑两种同样的方法:

PreparedStatement stmt = conn.createStatement("INSERT INTO students VALUES('" + user + "')");
stmt.execute();

PreparedStatement stmt = conn.prepareStatement("INSERT INTO student VALUES(?)");
stmt.setString(1, user);
stmt.execute();

如果“user”来自用户输入,而用户输入是

Robert'); DROP TABLE students; --

扫码关注云+社区

领取腾讯云代金券