Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 预处理语句和SQL注入_Java_Jdbc_Prepared Statement_Sql Injection - Fatal编程技术网

Java 预处理语句和SQL注入

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

我一直在读关于prepared语句的文章,它说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);

然后设置基于名称的值并执行查询。同样,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());