准备好的语句和SQL注入
我一直在阅读有关准备好的声明,并表示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);
然后设置基于名称的值并执行查询。 再次100%安全的SQL注入!
如果您像编写SQL语句那样将变量连接到SQL语句,就可以使用PreparedStatement执行SQL注入攻击。
你的查询应该是
String query = "INSERT INTO offers (name,email,text) VALUES (?,?,?)
通过像你一样连接值,你确实允许sql注入的可能性,因为这些变量的值可能是实际的SQL,这会导致你的插入做一些无意的事情。 你可以像我一样使用它,然后以编程方式设置它们。 这些值将正确地转义,从而防止发生SQL注入攻击。
阅读本文以了解如何设置? SQL中的值就像我写的一样。
使用预先准备的语句
链接地址: http://www.djcxy.com/p/44883.html