繁体   English   中英

预备语句和SQL注入

[英]prepared statement and SQL injection

我一直在阅读有关准备好的语句的信息,它说SQL注入仍然非常有可能。 现在,如果要创建Web应用程序,我会使用spring,但我认为它允许此类攻击很奇怪。

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

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

可以说上面的代码是我的查询。 什么是安全的替代方法,它将允许在mySQL数据库中自动递增。

如果像在将变量连接到SQL语句的方式编写SQL一样编写SQL,则使用PreparedStatement可能会发生SQL注入攻击。

您的查询应为

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

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

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

使用准备好的语句

准备好的语句查询将如下所示:

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%安全!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM