2015-04-03 142 views
0

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

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

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

可以说上面的代码是我的查询。什么是安全的选择,并会允许mySQL数据库中的自动增量。

+2

“的PreparedStatement迫使你挑指数” - 请解释。什么索引,什么柜台,你在说什么问题? – RealSkeptic 2015-04-03 11:14:50

+0

什么是柜台?你为什么需要挑选它?你在自动递增?这种情况下的位置是什么?请提供一个例子,说明您如何认为准备好的声明有效。 – 2015-04-03 11:16:48

+0

String query =“UPDATE offers SET name = name?WHERE name =?”; 尝试{ \t \t \t ps = conn.prepareStatement(query); \t \t \t ps.setString(1,user.getName()); \t \t \t ps.setString(2,user.getEmail()); \t \t \t ps.execute(query); \t \t} catch(Exception e){ \t \t \t System.out。println(“更新时出错:”+ e); \t \t} \t} – jocdrew21 2015-04-03 11:41:45

回答

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

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

+0

当我尝试使用您的方法@Stefaan Neyts时,出现SQL错误。 String query =“insert into offers(name,email,text)values(?,?,?);”; \t ps.setString(1,user.getName()); \t \t \t ps.setString(2,user.getEmail()); \t \t \t ps.setString(3,user.getText()); – jocdrew21 2015-04-03 11:47:26

3

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

您的查询应该是

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

通过级联值像你这样,你确实允许SQL注入的可能性,因为这些变量的值可以是实际的SQL这将导致您的插入做一些事情,没有打算。你可以像我一样使用它,然后以编程方式设置它们。这些值将正确地转义,从而防止发生SQL注入攻击。

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

Using Prepared Statements