Mybatis检查SQL注入

Mybatis 的 Mapper.xml 语句中 parameterType 向SQL语句传参有两种方式:#{ } 和 ${ }。

使用#{ }是来防止SQL注入,使用${ }是用来动态拼接参数。

如何排查出

1. 检查是否有$号

如果你使用的是ide代码编辑器,那么可以通过全局搜索${ , 快速定位到使用${ }拼接SQL的语句,在去找到外部传入参数的入口,闭合sql证明即可。

2. 检查是否有order by语句

同样的在搜索是否使用order by排序语句,如果有一步一步追踪是否有外部参数,未过滤就直接传递到order by语句里面来。

为什么#{ }就安全

#{ } 就类似JDBC的预编译,所以安全。类似如下SQL语句:(JDBC预编译的原理,希望后面能专门去研究一下,并写博文)

  • 使用 ${ }效果是:
select * from testtable where id="1" or true or id  # 1后面就是被攻击者恶意构造的字符

  • 而使用#{ } 的效果是:
select * from testtable where id="1\" or true or id\""         # 1后面就是被攻击者恶意构造的字符

什么情况下用不了#{}

答案是:在order by 排序语句的情况下不行,为什么?

先复习一下order by的用法

order by就是一个排序的工具。

# 这个1就是指第一个列索引,也可以写id (列索引)
select * from testtable ORDER BY 1 ASC #ASC表示按升序排序,DESC表示按降序排序

# 两个代码是一样的
select * from testtable ORDER BY id ASC #ASC表示按升序排序,DESC表示按降序排序

对于order by 我们是用不了#{}的,因为用了这个就会被自动转换成字符串,自动加引号,这样语句就不生效了。

<select id="selectStudentsByName" resultType="Student">
    select id,name,age,score from student order by #{column}
</select>

<!--编译出来的结果如下:-->
select * from table order by ‘column‘

会发现加上“” 双引号符号后,就没法正常排序了。

如何解决:

使用${},MyBatis就不会修改或转义改字符串。但是这样又不安全,会导致潜在的SQL注入攻击。所以我们需要自己去限制,不允许用户输入一些非法字段,通常只使用白名单方式校验。

总结

即使是安全的sql预编译技术,也是有适用范围的,一些应用场景也是不适用的。当我们在做黑盒或者审计的时候,碰到了预编译处理不了的场景,比如说排序功能的时候就得格外注意了,不然被人order by注入就悲剧了。

原文地址:https://www.cnblogs.com/mysticbinary/p/12613243.html

时间: 2024-10-29 21:34:18

Mybatis检查SQL注入的相关文章

聊一聊MyBatis 和 SQL 注入间的恩恩怨怨

整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 面试总被问分库分表怎么办?你可以这样怼他 3万字总结,Mysql优化之精髓 为了不复制粘贴,我被逼着学会了JAVA爬虫 技术部突然宣布:JAVA开发人员全部要会接口自动化测试框架 Redis 5种数据结构及对应使用场景,全会面试要加分的 引言 MyBatis 是一种持久层框架,介于 JDBC 和 H

mybatis 防止sql注入的 循环map写法

<foreach collection="condition.keys" item="k" separator="and"> <if test="null != condition[k]"> ${k} = #{condition[${k}]} </if> </foreach>

[转]SQL注入漏洞及绑定变量浅谈

1.一个问题引发的思考 大家在群里讨论了一个问题,奉文帅之命写篇作文,且看: String user_web = "user_web"String sql = "update user set user_web="+user_web+" where userid=2343"; 大家看看这条sql有没有问题,会将user_web字段 更新成什么? 问题的结论是:执行后的记录结果跟执行前一样,(执行时的sql语句为 update user set u

sql注入在线检测(sqlmapapi)

之前一搞渗透的同事问我,sqlmapapi.py是干啥的,我猜很多人都玩过sqlmap,但玩过sqlmapapi的应该比较少,今天就和大家一起看看如何使用以及一些美的地方. 说白了,sqlmapapi.py就是提供了一个检查sql注入的接口,我们可以直接通过发送http请求扫描sql注入,获取扫描结果等一系列操作. 下面通过实例演示如何使用: 一.启动服务器端 服务器后端使用的是bottle,一个Python Web微框架. 二. 我们使用requests这个库发送请求 1.新建任务 2.发送扫

mybatis中#{}与${}的差别(如何防止sql注入)

默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. #相当于对数据 加上 双引号,$相当于直接显示数据 示例1:执行SQL:select * from emp where name = #{employeeName}参数:employeeName=>Smith解析后执行的SQL:select * from emp where name = ? 示例2:

mybatis如何防止sql注入(2)

Mybatis框架下SQL注入漏洞修复建议?1. 模糊查询like SQL注入修复建议按照新闻标题对新闻进行模糊查询,可将SQL查询语句设计如下:select * from news where tile like concat('%',#{title}, '%'),采用预编译机制,避免了SQL语句拼接的问题,从根源上防止了SQL注入漏洞的产生.?2. in之后的参数SQL注入修复建议在对新闻进行同条件多值查询的时候,可使用Mybatis自带循环指令解决SQL语句动态拼接的问题:select *

MyBatis怎么防止SQL注入

SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者).[摘自] SQL injection - Wikipedia SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如"or '1'='1'"这样的语句),有可能入侵参数检验不足的应用程序.所以,在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性要求很高的应用中(比如银行软件),经常使用将

MyBatis如何防止SQL注入

转自:http://www.myexception.cn/sql/1938757.html SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者). SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如"or '1'='1'"这样的语句),有可能入侵参数检验不足的应用程序.所以,在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性要求很高的应

java持久层框架mybatis如何防止sql注入

sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1’=’1’”这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式. mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这