防御sql注入的最佳方式 预编译为什么能防止sql注入?
浏览量:2155
时间:2021-03-16 06:38:08
作者:admin
预编译为什么能防止sql注入?
因为preparedStatement中可以不包含数据,只包含操作,这样就不需要用数据来拼接SQL。
浅谈mybatis中的#和$的区别,以及防止sql注入的方法?
#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
例如,sqlMap 中如下的 sql 语句
select * from user where name = #{name}
解析为:
select * from user where name = ?
一个 #{ } 被解析为一个参数占位符 ? 。
${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换
例如,sqlMap 中如下的 sql
select * from user where name = "${name}"
当我们传递的参数为 "ruhua" 时,上述 sql 的解析为:
select * from user where name = "ruhua"
预编译之前的 SQL 语句已经不包含变量 name 了。
综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。
注意:${ } 在预编译之前已经被变量替换了,这会存在 sql 注入问题。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。