使用预准备语句进行SQL注入?

Hen*_*aul 11 sql sql-injection prepared-statement

如果我没记错的话,我认为Jeff在Stack Overflow播客中提到了SQL预处理语句中可能存在的弱点.我想知道他所指的是哪种弱点?它可能只是关于它的不当使用,还是更险恶的东西?

在我记忆中,播客没有更深入地探讨这个主题,它只是一句话.

Pab*_*ruz 6

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

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

有了准备好的陈述,我唯一的问题就是这个.请考虑以下Java代码:

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

在这里,您可以预期,如果您在表(名称)上有索引,它将由查询计划使用.好吧,它不会.因为PraparedStatement必须预先编译并预期最坏的情况:'%PATTERN%',例如.所以,它不会优化.我花了一段时间才想出这个.这导致我的数据库受损.:(

希望能帮助到你.


Bjö*_*örn 0

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