Java 预处理语句和SQL注入
我一直在读关于prepared语句的文章,它说SQL注入仍然是非常可能的。现在,如果我正在创建一个web应用程序,我会使用spring,但我认为它允许这种攻击很奇怪Java 预处理语句和SQL注入,java,jdbc,prepared-statement,sql-injection,Java,Jdbc,Prepared Statement,Sql Injection,我一直在读关于prepared语句的文章,它说SQL注入仍然是非常可能的。现在,如果我正在创建一个web应用程序,我会使用spring,但我认为它允许这种攻击很奇怪 PreparedStatement强制您选择索引。这将导致许多问题,因为您并不总是希望反复选择相同的位置来存储数据。即使创建计数器,也会适得其反,因为它会重置程序关闭的所有内容 String query = "INSERT INTO offers (name,email.text) VALUES '"+name+"','"+ema
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%安全的 准备好的语句查询如下所示:
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,则PreparedStatement可能会受到SQL注入攻击 您的查询应该是
String query = "INSERT INTO offers (name,email,text) VALUES (?,?,?)
通过像您那样连接这些值,您确实允许了sql注入的可能性,因为这些变量的值可能是实际的sql,这将导致您的insert执行一些非预期的操作。您可以像我一样使用?s,然后以编程方式设置它们。这些值将被正确地转义,以防止SQL注入攻击发生
阅读此内容了解如何设置?SQL中的值,就像我编写的一样
如果您像将变量连接到SQL语句那样编写SQL,则PreparedStatement可能会受到SQL注入攻击 您的查询应该是
String query = "INSERT INTO offers (name,email,text) VALUES (?,?,?)
通过像您那样连接这些值,您确实允许了sql注入的可能性,因为这些变量的值可能是实际的sql,这将导致您的insert执行一些非预期的操作。您可以像我一样使用?s,然后以编程方式设置它们。这些值将被正确地转义,以防止SQL注入攻击发生
阅读此内容了解如何设置?SQL中的值,就像我编写的一样
“PreparedStatement迫使您选择索引”-请解释。什么指数,什么计数器,你到底在说什么问题?什么是计数器?你为什么要选它?什么是自动递增的?在这种情况下,什么是位置?请举例说明您认为准备好的语句是如何工作的。String query=“UPDATE offers SET name=name?WHERE name=?”;请尝试{ps=conn.prepareStatement(查询);ps.setString(1,user.getName());ps.setString(2,user.getEmail());ps.execute(查询);}catch(异常e){System.out.println(“更新时出错:+e);}“PreparedStatement强制您选择索引”-请解释。什么指数,什么计数器,你到底在说什么问题?什么是计数器?你为什么要选它?什么是自动递增的?在这种情况下,什么是位置?请举例说明您认为准备好的语句是如何工作的。String query=“UPDATE offers SET name=name?WHERE name=?”;请尝试{ps=conn.prepareStatement(query);ps.setString(1,user.getName());ps.setString(2,user.getEmail());ps.execute(query);}catch(Exception e){System.out.println(“更新时出错:+e);}当我尝试使用您的方法@Stefaan Neyts时,会出现SQL错误。String query=“插入报价(姓名、电子邮件、文本)值(?,?);”;ps.setString(1,user.getName());ps.setString(2,user.getEmail());ps.setString(3,user.getText());当我尝试使用您的@Stefaan Neyts方法时,我会遇到SQL错误。String query=“插入报价(姓名、电子邮件、文本)值(?,?);”;ps.setString(1,user.getName());ps.setString(2,user.getEmail());ps.setString(3,user.getText());