预备语句的SQL注入?

如果我没有记错,我认为Jeff在Stack Overflow播客中提到了SQL准备语句中可能存在的一个弱点。 我想知道他指的是什么弱点? 这可能只是不恰当的使用,或者更险恶的东西?

我记忆中的播客没有更深入地讨论这个问题,它只是一个传递的评论。


我认为他所说的是,当你使用Prepared Statements时,SQL服务器可以缓存你的查询执行计划,所以,即使你修改了执行查询中的一些参数,服务器也可能选择错误的(可能是缓存的)执行计划这将表现非常糟糕。

他还提到了SQL Server 2008的一项新功能,强制引擎重新评估他用来克服这种情况的执行计划。

有了Prepared Statements,我唯一的问题就是这个。 考虑下面的Java代码:

String sql = "select * from table where name like ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "PATTERN%");
ResultSet rs = pstmt.executeQuery();

在这里,你会期望,如果你有一个表(名称)索引它将被查询计划使用。 那么,它不会。 因为PraparedStatement必须预编译并预期最糟糕的情况:例如“%PATTERN%”。 所以,它不会优化。 我花了一段时间才弄清楚这一点。 这导致我的数据库受到影响。 :(

希望能帮助到你。


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


如果准备的陈述具有以任何方式动态构建的参数,那么这很可能是弱点的来源。

如果你使用一个合适的数据库库和经过测试的类来设置参数,那么你在任何时候都不会打开自己的SQL注入语句,或者不是。

请记住,仅仅因为声明已准备好,或者因为您正在使用存储过程,这并不意味着您无法避免注入攻击。 只有当您使用数据库提供程序代码时,它才会对参数的输入进行清理(并将其应用于可以使用的所有参数),从而获得SQL注入的保护。

链接地址: http://www.djcxy.com/p/44871.html

上一篇: SQL injections with prepared statements?

下一篇: Unable to click on an element when page is loading