DOI:10.19551/jki.issn1672-9129.2021.12.044
面向MyBatis程序的SQL注入攻击及防御策略
李帅力㊀宋远峰(重庆工程学院㊀400056)
sql容易学吗
基金项目:重庆市教育委员会科学技术研究项目(项目编号:KJQN202001908)
摘要:随着信息技术和网络技术的飞速发展,WEB技术已经被应用到人们生活的各个领域,但是人们所面临的网络安全威胁风险也与日俱增,SQL注入攻击漏洞就是WEB安全中比较常见的一种安全威胁漏洞㊂本文分析了SQL注入攻击的原理,以及在MyBatis程序框架层面,SQL注入攻击常见的几种方式,并提出了针对SQL注入攻击的有效防御措施㊂
关键词:SQL注入;MyBatis;WEB应用;防御措施
中图分类号:TM769㊀㊀㊀文献标识码:A㊀㊀㊀文章编号:1672-9129(2021)12-0044-02
㊀㊀1㊀引言
信息化时代互联网技术的发展日新月异,人们的生活方式发生了翻天覆地的变化,互联网时代人们的生
活也更加便捷㊂基于WEB的互联网应用系统也被越来越广泛的应,但是WEB应用安全漏洞事件也经常发生,给人们的经济带来巨大的损失㊂而WEB系统常常作为攻击者攻击的对象的主要原因有:一是系统的开放性,WEB系统常常是作为公共服务产品面向公众开放,恶意攻击者可以访问这些系统并且有机会针对系统做技术分析;二是WEB应用中客户端和服务器进行数据通信传输是基于HTTP协议,攻击者可以篡改客户端的请求信息内容以达到攻击的目的;三是系统安全等级制度不够成熟,WEB系统在开发设计过程中,容易出现具有安全漏洞的程序代码,攻击者就有了可乘之机㊂本文基于WEB系统开发中常用的MyBatis框架代码技术层面,针对MyBatis框架下容易产生的SQL注入漏洞,提出几种防御措施㊂
2㊀SQL注入攻击原理
SQL注入攻击是一种网络攻击者对数据库的攻击行为㊂SQL注入产生的根本原因是攻击者骗过被攻击系统的校验机制将攻击代码伪装成正常的输入数据,与用户输入的命令代码拼接在一起,例如将 or1=1# 这样的语句拼接到请求参数值后面,使其伪造的SQL命令注入到后台数据库引擎执行,那么后台数据库就会容易受到注入攻击㊂当WEB应用程序连接到数据库,就为SQL注入攻击提供了可能性,在程序中所有构造SQL语句的位置都存在被攻击者攻击的风险㊂攻击者可以针对WEB应用程序代码的漏洞来实现攻击,攻击者能够利用HTTP的请求参数进行恶意SQL输入,通过篡改GET或POST请求的参数值达到SQL注入攻击的目的,攻击者将恶意SQL指令置入到传输的变量参数,使其能够在服务器
端执行,从而获得系统权限甚至整个系统数据库的数据㊂另外攻击者还可以利用有些服务器端保存主机头㊁用户代理头等HTTP请求头信息的行为,以达到可以通过在HTTP请求头信息中伪造语句实现SQL注入的目的㊂3㊀MyBatis框架下的SQL注入漏洞分析MyBatis框架是一种半自动化的持久层框架,在WEB应用开发中得到广泛的应用㊂MyBatis对SQL语句采用预编译机制,可有效预防SQL注入问题㊂另外动态SQL也是MyBa-tis强大特征之一,因为在实际开发当中经常需要动态传递参数,所以开发中常常需要用到动态SQL㊂MyBatis在对动态SQL语句进行预编译之前,会对SQL进行动态解析㊂My-Batis提供了两种支持动态SQL的语法:#{}和${},然而在SQL的动态解析环节,#{}和${}两种方式作用原理是不尽相同的,#{}被解析成为一个参数占位符 ? ,${}会替换成一个String类型字符串,在动态SQL解析阶段进行了变量的替换工作,此时就造成了SQL注入的风险㊂通过我们分析总结,MyBatis框架下比较容易产生SQL注入漏洞的情况主要分为以下三种㊂
3.1模糊查询㊂以订单管理业务为例,按照商品名称对订单记录进行模糊查询,考虑MyBatis安全编码规范,其SQL
语句如下:Select∗from orders where name like %# {name}% ㊂MyBatis预编译前进行动态SQL解析,解析后
语句:Select∗from orders where name like %?% ,但由于 ? 存在于引号之内,MyBatis不到占位符,那么程序将会
报错㊂开发员常常将SQL查询语句进行如下修改:Select∗from orders where name like %${name}% ,在这种情况下
程序将不会再次报错,但是如果开发人员未在在Java代码层面对做任何有效的处理将会产生SQL注入漏洞的风险,究其原因就是此时存在SQL语句拼接的问题㊂
3.2多值传输㊂在订单记录进行同条件多值查询的情
形下,如果当用户查询id分别为10001,10002,10003 1000N的订单记录时,我们结合MyBatis安全编码规范,相应的查询SQL语句可以写为:Select∗from orders where id in (#{ids}),在in之后传多个参数,在动态解析阶段in之后将
会解析为( 10001,10002,10003 1000N ),但是此时SQL 无法通过预编译,程序将会报错㊂实际应用中,开发人员则常常将SQL语句进行如下修改:Select∗from orders where id in(${ids}),虽然此种写法避免了程序报错,但与此同时引入了SQL语句拼接的问题,假如开发人员未在应用业务逻辑代码中对用户输入的内容做有效验证或过滤,依然会产生SQL注入漏洞风险㊂
3.3排序参数㊂当根据交易时间信息对订单进行排序
的时候,相应的SQL语句可以写为:Select∗from orders where name=#{name}order by#{time}desc,此
时程序依然
会报错,这是因为交易时间time并不是用户输入的参数,程序无法进行正常的预编译㊂开发人员常常将SQL查询语句修改如下:Select∗from orders where name=#{name}order by${time}desc㊂虽然此时程序可以正常通过预编译,但是却引入了SQL语句拼接问题,同样可能会引入SQL注入漏洞的风险㊂
4㊀防御策略
在一些安全性要求比较高的WEB应用中(比如银行软件),或可以使用将SQL语句全部替换为存储过程这样的方式来防止SQL注入,但其也有一定的局限性㊂在实际开发中,一般的WEB应用系统并不需要采用这种方式,在MyBa-tis框架程序层面,针对3中提到的SQL注入场景可采用如下应对措施预防SQL注入问题㊂
4.1模糊查询like的SQL注入防御㊂当根据商品名称
进行模糊查询时,其相应的SQL语句可以写为:Select∗from orders where name like concat( % ,#{name}, % ),
此种写法就可以通过MyBatis的预编译,在预编译之前使用关键字 concat ,有效避免了SQL语句恶意拼接的问题,可有效预防SQL注入漏洞的发生㊂
4.2in之后多值传输参数的SQL注入防御㊂我们在对
订单记录多条信息进行同条件多值查询时,可以采用MyBa-tis其自带的循环指令标签来避免SQL语句动态拼接的问
题㊂在MyBatis SQL映射文件中语句可以写成:<select id=" getOrders"parameterType="java.util.List"resultType="Or-der">Select∗from orders where id in<foreach collection=" ids"item="item"open="("separator=","close=")">#{i-tem}</foreach></select>,其中parameterType参数可以是Map㊁List㊁Set等数据类型,此时就可以有效避免SQL注入㊂当然除了在MyBatis程序层面做处理外,也可以在Java程序层面做处理来避免SQL注入漏洞㊂
4.3order by之后参数SQL注入防御㊂我们知道,对要执行的SQL语句采用预编译可以有效预防SQL注入,但是
预编译机制只能处理查询参数,在3.3中提到的排序查询SQL:Select∗from orders where name=#{name}order by# {time}desc,这里的订单交易时间time并非用户输入的查询参数,所以无法采用预编译机制㊂这种情况下,开发人员可以在Java层面做映射来避免产生SQL注入的问题㊂比如,当用户可以选择按照订单交易时间time和订单交易额mon-ey两个值进行排序时,如果用户选择按照订单交易时间排序就认为用户输入参数0,如果用户选择按照订单交易时间排序就认为用户输入参数1㊂此时我们
在代码层面做映射,当用户输入0时代码层面将其参数映射为time,当用户输入1时将其映射为money,当用户输入的是0和1之外的值,我们可将其转化为默认的排序选择time(或者money)㊂因此,在Java代码层面可以有效避免order by之后参数可能引发的SQL注入漏洞㊂
5㊀结语
WEB应用安全威胁不容忽视,应该针对不同类型的
㊃44㊃
DOI:10.19551/jki.issn1672-9129.2021.12.045
基于管理运筹学的库存控制研究
王盟升(河北钢铁集团邯钢公司㊀邯郸㊀056000)
摘要:库存是指为了满足未来的需求而暂时闲置的资源㊂一般情况下,我们设置库存的目的是为了防止材料在某一阶段出现短缺,避免因此造成供应㊁生产或者销售等业务活动的中断㊂按照合理的数量设置库存是生产过程中经营者所必需考虑的步骤,它在协调供需矛盾,保证生产顺利进行方面祈祷的作用不可替代㊂但是同时我们也要注意到,库存同时必然会造成一定的浪费,如储存过程中材料的损
耗和变质,额外的材料管理费用和仓库租金,以及其他资本消耗等等㊂一个企业的正常发展离不开一个好的库存管理系统㊂只有在良好的库存管理系统下,企业才可以提高周转率,降低总成本,从而获得更大的利润㊂
关键词:库存;库存管理;管理运筹学
中图分类号:TP301㊀㊀㊀文献标识码:A㊀㊀㊀文章编号:1672-9129(2021)12-0045-01
㊀㊀我国现阶段部分许多企业库存管理制度仍不完善,导致其库存管理方面总是出现各种各样的问题㊂要真正实现库存系统的优化,就不得不认识到,库存方面的计算方法是仓库管理的重要组成部分,如果不能科学合理的使用这一工具,必然会导致库存管理水平停滞不前㊂针对这种情况,管理运筹学作为最优化技术,便是一发弦上之箭,它以最直接的方式,为决策者提供有最依据的最优方案,以实现最有效的管理㊂[1]
1㊀库存控制简述
库存控制是指以控制库存为目的的一系列相关技术手段㊁科学管理及进出货操作过程的集合,这个系统贯穿于从物资的选择㊁规划㊁订货㊁进货㊁入库㊁储存及至最后出库的一个长过程,这些过程的作用结果,最后实现了按人们目标控制库存的目的㊂
库存控制最核心的目的是:在保证企业一切需求的前提下,将整体库存量动态保持于合理的水平上;依据状况适时㊁适量进行订货,避免缺货或者超储的情况发生;减少库存空间占用,控制库存资金占用,从而减少库存费用,加速整体资金周转㊂[2]
2㊀库存管理中常见的运筹学应用方法
库存管理方法较多,其中最著名的是ABC库存分类管理法,它是在19世纪由意大利经济学家最先提出来的㊂这个法则以特定标准将企业库存划分为A㊁B还有C三类,分别实行按照品种进行管理㊁按照类别进行控制还有按总额进行灵活掌握㊂对库存进行这样的分类,可以使使用者分清主次,采用合理的对策进行最为经济,同时最为有效的库存控制㊂
再比如定量订货管理法,其参数的确定方式如下: (1)在需求和订货提前期确定的情况下,不需设置安全
库存:
订货点=订货提前期(天)∗全年需求量/360
即R=LT∗D/360
(2)在需求和订货提前期都不确定的情况下需要设置安全库存:
订货点=(平均需求量∗最大订货提前期)+安全库存
安全库存=安全系数∗ɿ̄最大订货提前期∗需求变动值
又比如说定期订货法,该方法是以预先确定订货的时间间隔作为基准,来进行订货从而补充库存的管理方法  其原理是提前确定整个订货周期的最高库存数量,并按照一定的周期来检查库存,根据上述提到的最高库存量和实际库存,以及在途订货量和待出库商品数量,综合计算出每次最合理的订货量,从而根据订货量,再制定订货方式并组织订货㊂
以上是常见的分析方法,其他的还包括1.零库存方法2.寄售方法(超级市场方案)3.自来水式仓库方法4.供应商
专柜方式5.自动销售机方法等等
3㊀管理运筹学在库存控制当中的应用举例
以库存费用分析和平均库存法的计算方式为例,计算如下:
(1)原材料库存费用模型
库存费用=订货费+保管费
其中:订货费=(年需要量/订货量)∗一次订货费
保管费=平均库存量∗单位物资保管费=平均库存额∗保管费率
(2)半成品和成品库存费用模型
库存费用=工装调整费+保管费
其中:工装调整费=(年计划产量/生产批量)∗一次工装调整费
保管费=平均库存量∗单位物资保管费=平均库存额∗保管费率
再比如,像经济订货量的计算方法,同样是运筹学在库存控制中的一种应用:它是使总的存货费用达到最低的为目的,或以某个存货单元的订货批量最合理为目的的计算方式㊂
除了上述两种以外,其他主要计算方法还包括:
(1)表格计算法㊂
(2)图解法㊂
(3)数学方法㊂
以其中数学方法为例:由库存费用=订货费+保管费= (年需要量/订货量)∗一次订货费+平均库存量∗单位物
资保管费可推导出当订货费=保管费时库存总费用达到最低,带入已知数据可计算出经济订货量㊂其中平均库存量等于订货批量的一半,而平均库存额等于平均库存量乘以单价㊂
实际应用时,当我们需要某种零件,每年需要量为1200个,每次订货的订货费用为300元,每个零件保管费为2元,那么可以借此求每次的最佳订货批量吗?可以的,解答步骤如下:
解:设最佳订货批量为X个/次
则当保管费=订货费时,库存费用最低
即(X/2)ˑ2=1200ˑ300/X
X=600个/次
即每次最佳订货量为600
由库存费用=订货费+保管费=(年需要量/订货量)∗一次订货费+平均库存量∗单位物资保管费可推导出当订货费=保管费时库存总费用达到最低,带入已知数据即可计算出我单位此零件的最经济订货量㊂
4㊀结语
运筹学作为一门用来解决实际问题的学科,在处理千差万别的各种问题时,一般有以下几个步骤:确定目标㊁制定方案㊁建立模型㊁制定解法,这与库存控制所谋求的最优处理方式不谋而合,运筹学有广阔的应用领域,它已渗透到诸如服务㊁搜索㊁人口㊁对抗㊁控制㊁时间表㊁资源分配㊁厂址定位㊁能源㊁设计㊁生产㊁可靠性㊁等各个方面,而库存控制毫无疑问也会成为它可以大展身手的地方㊂
参考文献:
[1]郭义荣编著.高等学校教材运筹学:清华大学出
版社
[2]朱荣花.试论企业中物流管理之杀手  库存问题
SQL注入攻击分别采取有效的防御措施,WEB应用开发人员可在代码层面有效避免SQL注入攻击㊂通过本文的实践,在MyBatis程序层面,对常见SQL注入攻击采取有效防御措施,为WEB应用相关人员提供一定参考㊂
参考文献:
[1]李明.Web应用SQL注入漏洞分析及防御研究[J].福建电脑,2020,36(05):25-27.
[2]黄小丹.SQL注入漏洞检测技术综述[J].现代计算
机,2020(10):51-58.
[3]作刘建亮,乔兴华.SQL注入攻击与防范之研究[J].科学技术创新,2020(08):24-25.
作者简介:李帅力(1990.06-),男,汉族,河南开封人,工作单位重庆工程学院,研究生,讲师,研究方向物联网㊁软件技术㊁人工智能㊂
㊃54㊃