准备好的语句和SQL注入

时间:2015-04-03 11:11:24

标签: java jdbc prepared-statement sql-injection

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

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

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

让我们说上面的代码是我的查询。什么是安全的替代方案,并允许mySQL数据库中的自动增量。

2 个答案:

答案 0 :(得分:3)

如果编写SQL,就可以使用PreparedStatement进行SQL注入攻击,就像你将变量连接到SQL语句一样。

您的查询应该是

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

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

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

Using Prepared Statements

答案 1 :(得分:1)

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

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