Mybatis的SQL注入隐患操作复现&防止SQL注入

很多人都知道SQL存在SQL注入引起的安全问题,但是很少有开发者去尝试过是怎样一个注入,下面将复现Mybatis的SQL注入问题并给出正确操作。

1.复现SQL注入操作

1.新建一张表(MqSQL):
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `age` int(10) UNSIGNED NULL DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `age`(`age`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1, 25, 'Robert');

SET FOREIGN_KEY_CHECKS = 1;
2.执行like查询操作
select *
from test 
where name like '%Ro%'

查询结果:
在这里插入图片描述

3.查询内容换成SQL注入语句
Robert';DROP TABLE test;--

这样SQL就变成:

select *
from test 
where name like '%Robert';DROP TABLE test;--%'

执行后会发现我们的表被删掉了。这就是SQL注入漏洞。

2.解决SQL注入隐患

我们Mybatis中动态SQL有${}和#{}两种解释方式:

  • ${}是直接将参数拼接到SQL中,这样就存在SQL注入的危险漏洞;
  • #{}会先识别参数类型,是字符串的话会完全按照字符串去处理,也就是这种方式会直接将参数Robert’;DROP TABLE test;–当做一个字符串,这样就解决了SQL注入的问题。

如下使用${}:危险SQL

select *
from test 
where name like '%${name}%'

使用#{}:安全SQL

select *
from test 
where name like concat('%', #{name}, '%')

所以日常开发过程,一定要首选#{}方式,不得已情况下再使用${}

3.那么有人会问什么情况是不得已的情况?

比如如下场景:test表有很多临时表,这些临时表表名是随机生成的,我们不能将表名直接写死到SQL,所以需要使用动态参数,如下:

select *
from #{table_name}
where name like concat('%', #{name}, '%')

这种情况使用#{}方式就会报错,因为table_name会被解析成字符串如下:

select *
from 'test'
where name like concat('%', 'Ro', '%')

在执行SQL时就报错,语法错误
在这里插入图片描述

改为${}就可以了,那么这时候还存在SQL注入隐患吗?试一下:

select *
from test;DROP TABLE test;--
where name like concat('%', 'Ro', '%')

发现test表仍被删除掉了,所以只要使用了${}就存在SQL注入隐患。

解决办法:对使用${}的动态参数在Java端做好严格管控:

  1. 这种参数不应该由接口传入
  2. 由接口传入的应该做好参数校验,防止恶意参数

以上就是关于SQL注入隐患的解释及解决方案,作为后端开发人员要时刻保持安全意识,永远记住一点:对外开放的接口都不是绝对安全

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久层框架,它提供了一种将SQL语句与Java代码解耦的方式。尽管MyBatis是一个相对安全的框架,但在使用过程中,仍存在可能发生SQL注入攻击的风险。 要防止MyBatis SQL注入攻击,可以采取以下几种方法: 1. 使用参数化查询(Prepared Statement):确保所有的用户输入参数都通过参数占位符的方式传递到SQL语句中,而不是直接拼接到SQL语句中。这样可以避免恶意用户输入特殊字符来破坏SQL语句结构。 2. 输入验证和过滤:在接收用户输入之前,对输入进行合法性验证和过滤。可以使用正则表达式、白名单或黑名单等方式来限制输入内容的合法范围,并过滤掉可能造成SQL注入的特殊字符。 3. 使用MyBatis的动态SQL功能:MyBatis提供了动态SQL功能,可以根据不同的条件动态拼接SQL语句。在使用动态SQL时,应该使用MyBatis提供的安全方法来拼接字符串,而不是直接拼接用户输入。 4. 限制数据库权限:为数据库用户设置合适的权限,最小化其对数据库的操作权限。这样即使发生注入攻击,攻击者也只能对具有限制权限的数据进行操作。 5. 定期更新MyBatis版本:及时关注MyBatis的更新和安全公告,及时更新到最新版本,以获取最新的安全修和功能改进。 总之,为了防止MyBatis SQL注入攻击,需要使用参数化查询、输入验证和过滤、动态SQL、限制数据库权限以及定期更新MyBatis版本等多种手段来综合保护系统安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值