持久层 Mybatis 中对于 SQL 注入的问题,聊聊你的想法?
SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息
在 mybatis 中最常见的注入风险是书写的时候使用 ${}
上述图片表述的 JDBC 的利用两种预编译事时的方式;
第一种
preparedStatement 可以直接写 sql 语句,然后是 executeUpdate;
防止 sql 注入
第二种是:Statement,不能直接写,executeUpdate 表示直接执行的 sql 语句,
是直接的字符串拼接
mybatis 获取参数值的两种方式:
1. #{}--->preparedStatement 表示通配符下的预编译语句,会将 #{}转换成???
2.${}-->利用的是 Statement 的对象使用字符串拼接的方式来操作 SQL
mybatis #{}和${}的区别是什么
本质:#{}是预编译处理,$}是字符串替换。
(1)mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值。
(2)mybatis 在处理${}时,就是把${}替换成变量的值。
(3) 使用#{子可以有效的防止 SQL 注入,提高系统安全性。原因在于:预编译机制。预编译完成之后,SQL 的结构已经固定,即便用户输入非法参数,也不会对 SQL 的结构产生影响,从而避免了潜在的安全风险。
(4)预编译是提前对 SQL 语句进行预编译,而其后注入的参数将不会再进行 SQL 编译。我们知道,SQL 注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止 SQL 注入
总结
对于 预编译之后的 SQL,可以直接将 SQL 注入的条件排除,做到非侵入性;
版权声明: 本文为 InfoQ 作者【卢卡多多】的原创文章。
原文链接:【http://xie.infoq.cn/article/84cac553777efe6cdd2c51f67】。文章转载请联系作者。
评论