Update一下,评论里我的回复可能是不正确的…
在使用PreparedStatement执行SQL命令时,命令会带着占位符被数据库进行编译和解析,并放到命令缓冲区。然后,每当执行同一个PreparedStatement语句的时候,由于在缓冲区中可以发现预编译的命令,虽然会被再解析一次,但不会被再次编译。
而SQL注入只对编译过程有破坏作用,执行阶段只是把输入串作为数据处理,不需要再对SQL语句进行解析,因此解决了注入问题。
因为SQL语句编译阶段是进行词法分析、语法分析、语义分析等过程的,也就是说编译过程识别了关键字、执行逻辑之类的东西,编译结束了这条SQL语句能干什么就定了。而在编译之后加入注入的部分,就已经没办法改变执行逻辑了,这部分就只能是相当于输入字符串被处理。
==========原答分割线
刚好这两天在学习这块的知识
《WEB应用安全权威指南》中是这样讲占位符的
书中附注中还有一句话,静态占位符在ISO或JIS中,也被称为预处理语句(Prepared Statement)。
其中提到绑定变量时字面量会被妥善处理指的是数据库引擎会将变量中的字符进行转义处理。
这有一篇关于数据库将变量进行转义的博文(是Java的处理方法),不过他转义后的字符串写错了,在博文的评论里有人指出了正确的转义后字符串。
书中后面也给了安全连接方法的参考
其余内容可参考这本书的相关章节。