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

新手上路,请多包涵

我知道 PreparedStatements 避免/防止 SQL 注入。它是如何做到的?使用 PreparedStatements 构造的最终表单查询是字符串还是其他形式?

原文由 Prabhu R 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 550
2 个回答

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

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

原文由 tangens 发布,翻译遵循 CC BY-SA 2.5 许可协议

考虑两种做同一件事的方法:

 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();

如果“用户”来自用户输入并且用户输入是

Robert'); DROP TABLE students; --

然后在第一个实例中,你会被冲洗干净。第二,你会很安全,Little Bobby Tables 会在你的学校注册。

原文由 Paul Tomblin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题