写点什么

持久层 Mybatis 中对于 SQL 注入的问题,聊聊你的想法?

用户头像
卢卡多多
关注
发布于: 刚刚
持久层Mybatis中对于SQL注入的问题,聊聊你的想法?

SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息


在 mybatis 中最常见的注入风险是书写的时候使用 ${}



上述图片表述的 JDBC 的利用两种预编译事时的方式;


  • 第一种


preparedStatement 可以直接写 sql 语句,然后是 executeUpdate;


防止 sql 注入


  • 第二种是:Statement,不能直接写,executeUpdate 表示直接执行的 sql 语句,


是直接的字符串拼接


mybatis 获取参数值的两种方式:

1. #{}--->preparedStatement 表示通配符下的预编译语句,会将 #{}转换成???



SQL语句一般是
insert into payment (serial) values(#{serial}); --不用去管单引号的问题,因为在String赋值的时候,他会自动的添加, 比如‘男’
复制代码


2.${}-->利用的是 Statement 的对象使用字符串拼接的方式来操作 SQL



SQL语句一般是
insert into serial values('${serial}'); '${serial}' --必须要管单引号的问题,他不会自动的添加,可能导致出错误;
复制代码

mybatis #{}和${}的区别是什么

本质:#{}是预编译处理,$}是字符串替换。


(1)mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值。


(2)mybatis 在处理${}时,就是把${}替换成变量的值。


(3) 使用#{子可以有效的防止 SQL 注入,提高系统安全性。原因在于:预编译机制。预编译完成之后,SQL 的结构已经固定,即便用户输入非法参数,也不会对 SQL 的结构产生影响,从而避免了潜在的安全风险。


(4)预编译是提前对 SQL 语句进行预编译,而其后注入的参数将不会再进行 SQL 编译。我们知道,SQL 注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止 SQL 注入

总结

对于 预编译之后的 SQL,可以直接将 SQL 注入的条件排除,做到非侵入性;

发布于: 刚刚阅读数: 2
用户头像

卢卡多多

关注

努力寻找生活答案的旅途者 2020.04.12 加入

公众号:卢卡多多,欢迎一起交流学习

评论

发布
暂无评论
持久层Mybatis中对于SQL注入的问题,聊聊你的想法?