准备好的语句和 SQL 注入

prepared statement and SQL injection

我一直在阅读准备好的语句,它说 SQL 注入仍然很有可能。现在,如果我正在创建一个 Web 应用程序,我会使用 spring,但我认为它允许这种攻击很奇怪。

PreparedStatement 强制您选择索引。这会导致很多问题,因为您不会总是想要一遍又一遍地选择相同的位置来存储数据。即使您创建了一个计数器,它也会适得其反,因为它会重置程序关闭的所有内容。

String query = "INSERT INTO offers (name,email.text) VALUES 
'"+name+"','"+email+ "','"+text+"'";

假设上面的代码是我的查询。什么是安全的替代方案,将允许在 mySQL 数据库中自动递增。

准备好的语句查询将是这样的:

String sql = "insert into offers (name, email, text) values(?, ?, ?);

您将以此创建一个 PreparedStatement。然后设置从 1 开始的索引值并执行查询。 SQL 注射 100% 安全!

对于 Spring,您可能会使用 JdbcTemplate。请注意,有一个 NamedParameterJdbcTemplate 实现不使用索引,而是使用命名参数。查询将是:

String sql = "insert into offers (name, email, text) values(:name, :email, :text);

然后设置基于名称的值并执行查询。 SQL 注射再次 100% 安全!

SQL 如果您像将变量连接到 SQL 语句那样编写 SQL,则 PreparedStatement 可能会发生注入攻击。

您的查询应该是

String query = "INSERT INTO offers (name,email,text) VALUES (?,?,?)

通过像您那样连接这些值,您确实允许 sql 注入的可能性,因为这些变量的值可能是实际的 SQL,这会导致您的插入执行一些不正确的操作故意的。您可以像我一样使用 ?s,然后以编程方式设置它们。这些值将被正确转义,以防止发生 SQL 注入攻击。

阅读本文以了解如何设置 ? SQL 中的值就像我写的那样。

Using Prepared Statements