Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
准备语句的SQL注入?_Sql_Sql Injection_Prepared Statement - Fatal编程技术网

准备语句的SQL注入?

准备语句的SQL注入?,sql,sql-injection,prepared-statement,Sql,Sql Injection,Prepared Statement,如果我没记错的话,我想Jeff在Stack Overflow播客中提到了SQL语句中可能存在的一个弱点。我想知道他指的是什么样的弱点?可能就在这一点上,还是更险恶的事情 我记得,播客并没有深入探讨这个问题,它只是一个附带的评论。我没有听过播客,但根据我的经验,只有准备好的陈述才有好处。它通常会提高应用程序的性能,并防止SQL注入(如果使用正确,而不是作为链接中的第二个示例)。如果准备的语句以任何方式动态构造参数,那么这很可能是弱点的根源 如果您使用带有测试类的适当数据库库来设置参数,那么无论是否

如果我没记错的话,我想Jeff在Stack Overflow播客中提到了SQL语句中可能存在的一个弱点。我想知道他指的是什么样的弱点?可能就在这一点上,还是更险恶的事情


我记得,播客并没有深入探讨这个问题,它只是一个附带的评论。

我没有听过播客,但根据我的经验,只有准备好的陈述才有好处。它通常会提高应用程序的性能,并防止SQL注入(如果使用正确,而不是作为链接中的第二个示例)。

如果准备的语句以任何方式动态构造参数,那么这很可能是弱点的根源

如果您使用带有测试类的适当数据库库来设置参数,那么无论是否准备好语句,您都不会在任何时候接受SQL注入


请记住,仅仅因为准备了语句,或者因为您使用的是存储过程,并不意味着您可以免受注入攻击。只有当您使用数据库提供程序代码来清理参数输入(以及将其应用于所有可使用的参数)时,您才能获得SQL注入的保护。

除了正常的SQL注入(我们可能称之为一阶)攻击之外,还有二级攻击。例如,存储过程使用字符串连接来构建查询,然后执行查询,这种情况并不少见。如果检索到的字段值的结果包含在这样的串联中,则存在注入的危险。

我认为他说的是,当您使用准备好的语句时,SQL server可以缓存您的查询执行计划,因此,即使您修改执行查询的某些参数,服务器也可能选择错误的(可能是缓存的)执行计划将执行得非常糟糕

他还提到了SQLServer2008的一个新功能,该功能可以强制引擎重新评估他用来克服这种情况的执行计划

有了准备好的声明,我唯一的问题就是这个。考虑下面的java代码:

String sql = "select * from table where name like ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "PATTERN%");
ResultSet rs = pstmt.executeQuery();
在这里,如果表(名称)上有索引,则查询计划将使用该索引。不会的。因为PrParedStatement必须预编译并预期最坏的结果,例如:'%PATTERN%'。所以,它不会优化。我花了一段时间才弄明白这一点。这导致我的数据库受损(

希望能有帮助