来自OWASP page on Preventing SQL Injection in Java:
作为参数传递给预准备语句的变量将由JDBC驱动程序自动转义。
我理解预准备语句如何将用户输入分开作为参数内容处理而不是作为SQL命令的一部分。但我偶然发现了上面引用的句子,我想知道所有逃避的事情是什么。这有助于防止注射攻击?
答案 0 :(得分:2)
假设您的陈述是
"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注入的全部内容。