OWASP page on Preventing SQL Injection in Java


  作为自变量传递给准备好的语句的变量将由JDBC驱动程序自动转义。


我了解准备好的语句如何将用户输入分隔为参数内容而不是SQL命令的一部分。但是我偶然发现了上面引用的句子,我想知道到底是怎么回事。这如何防止注射攻击?

最佳答案

假设您的陈述是

"select * from foo where name = '" + name + "'";


现在,如果名称变量恰好是O'Reilly,则您将得到以下SQL查询,该查询无效:

select * from foo where name = 'O'Reilly'


改用准备好的语句:

"select * from foo where name = ?"


然后,驱动程序会将参数正确地绑定为字符串,并且O'Reilly中的单引号不会被解释为以'O开头的字符串的结尾。

在这种简单情况下,不使用准备好的语句将“仅”导致应用程序中的异常。但是如果有人使用类似

' or 1 = 1 or name <> '


查询将变为

select * from foo where name = '' or 1 = 1 or name <> ''


查询将因此加载表的每一行。这就是SQL注入的全部内容。

关于java - JDBC驱动程序转义准备好的语句的参数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22569694/

10-09 16:37