【安全】mybatis中#{}和${}导致sql注入问题及解决办法

【安全】mybatis中#{}和${}导致sql注入问题及解决办法0.问题
使用mybatis的时候遇到了#{}和${}可能导致sql注入的问题
1.预先了解
(1)#{}
#{} 底层通过prepareStatement对当前传入

0.问题

在使用mybatis时,遇到#{}和${}可能导致SQL注入问题。

1.预先了解

(1)#{}

#{} 底层对当前通过prepareStatement接收到的SQL进行预编译。 #{ } 被解析为参数占位符?#{} 解析后,字符串类型数据会自动加上引号。 没有#{}可以很大程度上防止SQL注入(SQL注入发生在编译过程中,因为某些特殊字符被恶意插入,最终编译成恶意执行操作)#{}通常用在插入字段和where条件中,防止SQL注入。

(2)${}

${} 是纯字符串替换。变量替换是在动态SQL 解析阶段执行的。 SQL字符串拼接中使用${}时必须非常小心。用它。然而,一些不直接涉及系统用户的功能,例如动态切换表或库名称,则不是注入问题。在用户将直接与之交互的SQL 中使用它时要小心。

2.举个栗子

(1)${}

1)sql注入

@Select(\”从名称=${name} 的用户中选择*\”)

列表sqltest1(字符串名称);

传递的参数是

名称=“1”或1=“1”;

那么数据库执行的最后一条语句将是:

select * from user where name=‘1’ OR 1=’1’;

这直接导致SQL注入并让攻击者成功登录。

2)语句堵塞

@Select(“按${column}从用户订单中选择*”)

列表sqltest1(字符串列);

传递的参数是

Column=“从id 中选择1,((选择sleep(1000))a)”

那么数据库执行的最后一条语句将是:

select * from user order by id,(select 1 from (select sleep(1000))a)

我们可以看到这个程序阻塞了1000秒,导致攻击者阻塞了该语句。

(2)#{}

1)无法执行

@Select(\”按#{column}从用户订单中选择*\”)

列表sqltest1(字符串列);

传递的参数是

列=“名称”;

#{}然后自动给参数加上单引号,数据库语句如下:

按“姓名”从用户订单中选择*

无法正常运行

2)无法执行

@Select(“从名称类似‘%#{name}%’的用户中选择*”)

列出sqltest2(字符串名称);

传递的参数是

name=\”尹\”;

然后数据库语句如下所示

从用户中选择*,其中名称类似于“%”name“%”

直接报错是不行的

3.解决办法

通常常见的解决方案是使用#{}而不是KaTeX解析。错误: 应为“EOF”,但“#”就位

14: {},但某些使用#{}的语句会导致语句错误(因为#{}.{}的顺序是动态指定的)

这种方法类似于模糊匹配,比如对字段进行排序,但是这种方法会引入SQL注入问题。具体解决办法如下。

(1)动态指定order by 排序字段

自定义您的地图。存储的key是前端传过来的value,value是参与自定义排序的字段名。如果您确实想要进行自定义排序,请使用此地图。

//key为前端传入的值,value为数据库中对应列的值

公共静态MapString,字符串orderByKeyMap=新HashMapString,String(){

{

put(\”用户ID\”,\”id\”);

put(\”姓名\”,\”姓名\”);

}

@Select(\”按#{column}从用户订单中选择*\”)

列表sqltest1(字符串列);

用户列表=mapper.sqltest3(User.orderByKeyMap.get(“name”));

这样你就不会犯错误

(2)like模糊匹配

使用concat连接#{}字符串不会报错,也不会导致索引失效。

@Select(“从名称类似concat(‘%’,#{name},‘%’) 的用户中选择*”)

列出sqltest2(字符串名称);

请输入参数

name=\”尹\”;

执行的语句是编程

select * from user where name like concat(\’%\’, \’yin\’, \’%\’);

这将解决你的问题

4.如何防止sql注入?

1. 使用预编译机制

使用预编译机制并减少使用字符串连接来传递参数。这就是SQL注入问题的根本原因。

2. 要对特殊字符转义

某些特殊字符(例如%)在用作like 语句中的参数时必须进行转义。

3. 要捕获异常

注意,有些异常信息中包含库名、表名、字段名等SQL信息,所以接口必须直接返回异常信息。利用这些信息,攻击者可以通过SQL 注入随意攻击数据库。目前主流的做法是使用专用网关服务,统一暴露外部接口。当用户请求某个接口时,首先会经过该接口,然后将请求转发给业务服务。这样做的好处是可以统一封装返回数据的返回体,如果发生异常,可以返回统一的异常信息,隐藏敏感信息。电流限制和权限控制也是可能的。

4. 使用代码检测工具

使用sqlMap等代码检测工具可以检测SQL注入漏洞。

5. 要有监控

需要监控数据库SQL执行情况,如有异常,会通过邮件或短信及时发出提醒。

6. 数据库账号需控制权限

在生产数据库中建立一个单独的帐户,并且只分配与DML相关的权限,并且没有对系统表的访问权限。不要直接在程序中使用管理员帐户。

7. 代码review

建立代码审查机制有助于发现隐藏问题,提高代码质量。

8. 使用其他手段处理

如果无法使用预编译参数,请启用Druid的过滤防火墙或编写自己的代码逻辑来过滤所有可能注入的关键字。

e题外话

许多初次进入计算机行业或计算机相关专业大学毕业的人由于缺乏工作经验而很难找到工作。让我们看两个数据集。

预计2023年全国大学毕业生将达到1158万人,就业形势严峻。

根据全国网络安全宣传周期间发布的数据,到2027年,我国网络安全人才缺口将达到327万人。

每年应届毕业生就业形势困难,网络安全人才缺口达100万。

6月9日,Max Research 2023年就业蓝皮书(含《2023年中国本科生就业报告》 《2023年中国高职生就业报告》)正式发布。

2022年大学毕业生月收入最高的10个专业

本科计算机专业和高职自动化专业月收入较高。 2022年,本科计算机专业和高职自动化专业月工资分别为6863元和5339元。其中,本科计算机专业起薪与2021级基本持平,高职自动化专业月薪大幅上涨,2022级排名第一,领先于轨道交通专业(5295元)。

具体看专业,2022届本科班月收入最高的专业是信息安全(7579元)。与2018届毕业生相比,电子科学与技术、自动化等人工智能相关本科专业表现良好,起薪较五年前增长19%。数据科学和大数据技术虽然是近年来的新专业,但表现不俗,位列2022届本科毕业生毕业后六个月月薪最高的前三专业。 —— 法语系是唯一一个人文社会科学专业,在五年前跻身薪资最高院系前十名后,现已跌出前十名。

“没有网络安全就没有国家安全。”如今,网络安全已经上升到国家战略层面,成为影响国家安全和社会稳定的最重要因素之一。

网络安全行业特点

网上的学习资源很多,但基本不完整。这是我录制的一个互联网安全视频教程,并附带了上面路线图中所有知识点的解释。

内容包括学习网络安全方法、网络安全操作等安全评估、渗透测试基础知识、漏洞详解、计算机基础知识等入门网络安全必须了解的学习内容。

2、人才缺口大,就业机会多

我还整理了自己的技术文档,其中包括我参加大规模网络安全运营、CTF、SRC漏洞研究的经验和技术点。由于内容的保密性,有超过200 种电子书可供使用。不要一一展示。

1.学习路线图

“如果你想做好你的工作,你首先必须磨练你的工具。”我为大家整理了数十种最流行的黑客工具。覆盖范围主要是信息收集、Android黑客工具、自动化工具、网络钓鱼等。欢迎有兴趣的同学来看看。

我还有视频中提到的案例的源代码和相应的工具包,所以如果你愿意的话,可以把它们带回家。

这些问题在面试深信服、奇安信、腾讯或者其他大公司的时候经常会遇到。如果您有任何好的问题或好的见解,请分享。

参考分析:深信服官网、奇安信官网、Freebuf、csdn等。

内容特点:组织清晰、图形化,易于理解。

内容概述:内网、操作系统、协议、渗透测试、安全服务、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、包括BP、MSF ……

以上关于mybatis中【安全】#{}和${}引起#SQL注入问题及解决方案的相关内容来自源码网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92966.html

(0)
CSDN的头像CSDN
上一篇 2024年7月4日
下一篇 2024年7月4日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注