JDBC中为啥preparestatement更安全?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC中为啥preparestatement更安全?相关的知识,希望对你有一定的参考价值。

statement拼接字符串会遭到sql注入攻击,这个我能理解。但是不能理解为什么preparestatement预编译后就不会遭到攻击,他不是也要设置参数吗,这些参数最后难道不是跟预编译的sql拼接在一起然后发给数据库吗?他是什么执行原理??????

所谓遭到注入因为你用statement的时候,输入的字符串和原sql构成新的sql语句,不是普通的字符串;
而PreparedStatement对于sql语句是预编译的,输入的字符串是add进去的,就算你输入了注入语句,也会被当成普通字符串处理。
你可以自己用IDE连接到java的源文件,单步调试两个statement看一下区别。
参考技术A 他执行的原理不同

普通的SQL是字符串拼接,所以会有注入现象

而prep形成的语句是存储过程(使用事件查看器可知道真实语句)

sp_prepexec 什么的 然后是你的主体语句,最后几位参数是语句中的变量

不会被注入
参考技术B 您好,提问者:
preparestatement这个东西支持占位符。
例如:values(?,?); 这样传入一个'或者数据库中的特殊字符也没错。
而一般的values(''','aa');这样就挂了,报错的。

以上是关于JDBC中为啥preparestatement更安全?的主要内容,如果未能解决你的问题,请参考以下文章

jdbc 中prepareStatement对sql中的占位符赋值问题

JDBC PrepareStatement对象执行批量处理实例

JDBC中PrepareStatement 和Statement

JDBC-Statement,prepareStatement,CallableStatement的比较

JDBC——CreateStatement和PrepareStatement作用区别

谷歌脚本:JDBC prepareStatement 失败