我知道 PreparedStatements 避免/防止 SQL 注入。它是如何做到的?使用 PreparedStatements 构造的最终表单查询是字符串还是其他形式?
原文由 Prabhu R 发布,翻译遵循 CC BY-SA 4.0 许可协议
我知道 PreparedStatements 避免/防止 SQL 注入。它是如何做到的?使用 PreparedStatements 构造的最终表单查询是字符串还是其他形式?
原文由 Prabhu R 发布,翻译遵循 CC BY-SA 4.0 许可协议
考虑两种做同一件事的方法:
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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
1 回答2.4k 阅读✓ 已解决
SQL 注入的问题在于,用户输入被用作 SQL 语句的一部分。通过使用准备好的语句,您可以强制将用户输入作为参数的内容来处理(而不是作为 SQL 命令的一部分)。
但是,如果您不使用用户输入作为准备语句的参数,而是通过将字符串连接在一起来构建 SQL 命令,那么即使使用准备语句,您 仍然容易受到 SQL 注入攻击。