Mybatlis SQL 注入与防范
SQL注射原理
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
攻击方式
猜表名
猜列名
拉全表
' or 1 = 1 #
#可以注释掉后面的一行SQL代码
实战演练
正常请求
http://xxxxxx/sc?cn=sc
响应结果数量:
注入请求
http://xxxxxx/sc?cn=sc' or 1= 1 or '' = '
响应结果数量:
可以从响应结果数中看到,它已经几乎把我们所有的数据给拉了出来。
防御调整
原查询语句
<!--查询学校--> <select id= "selectSchool" resultMap= "BaseResultMap" parameterType= "map" > select xxx from yyyy where zzz = 'section' and deleted_at is null and is_open = 1 < if test= "name !=null" > and name like '%${name}%' </ if > < if test= "pinyin !=null" > and pinyin_initial like '${pinyin}%' </ if > order by id </select> |
调整后语句
<!--查询学校--> <select id= "selectSchool" resultMap= "BaseResultMap" parameterType= "map" > select xxx from yyyy where zzz = 'section' and deleted_at is null and is_open = 1 < if test= "name !=null" > and name like concat(concat( '%' ,#{name}), '%' ) </ if > < if test= "pinyin !=null" > and pinyin_initial like concat((#{pinyin}), '%' ) </ if > order by id </select> |
调整后执行日志
2016 - 03 - 11 16 : 06 : 29.661 [http-nio- 8080 -exec- 8 ] DEBUG org.mybatis.spring.SqlSessionUtils 106 getSqlSession- Creating a new SqlSession 2016 - 03 - 11 16 : 06 : 29.663 [http-nio- 8080 -exec- 8 ] DEBUG org.mybatis.spring.SqlSessionUtils 142 getSqlSession- SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession @647a5210 ] was not registered for synchronization because synchronization is not active 2016 - 03 - 11 16 : 06 : 29.677 [http-nio- 8080 -exec- 8 ] DEBUG o.m.spring.transaction.SpringManagedTransaction 85 openConnection- JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl @69787b57 ] will not be managed by Spring 2016 - 03 - 11 16 : 06 : 29.678 [http-nio- 8080 -exec- 8 ] DEBUG c.z.customer.base.dao.DistrictMapper.selectSchool 132 debug- ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl @69787b57 ] 2016 - 03 - 11 16 : 06 : 29.678 [kafka-producer-network-thread | producer- 2 ] DEBUG org.apache.kafka.clients.NetworkClient 385 maybeUpdateMetadata- Trying to send metadata request to node - 1 2016 - 03 - 11 16 : 06 : 29.679 [http-nio- 8080 -exec- 8 ] DEBUG c.z.customer.base.dao.DistrictMapper.selectSchool 132 debug- ==> Preparing: select id ,name ,parent_id,district_type,pinyin,pinyin_initial from districts where district_type = 'section' and deleted_at is null and is_open = 1 and name like concat(concat( '%' ,?), '%' ) order by id 2016 - 03 - 11 16 : 06 : 29.682 [http-nio- 8080 -exec- 8 ] DEBUG c.z.customer.base.dao.DistrictMapper.selectSchool 132 debug- ==> Parameters: sh ' or 1 =1 or ' ' = ' (String) 2016 - 03 - 11 16 : 06 : 29.705 [http-nio- 8080 -exec- 8 ] DEBUG org.mybatis.spring.SqlSessionUtils 170 closeSqlSession- Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession @647a5210 ] |
调整后响应数据为空
{
"success"
:
true
,
"data"
: {
"schools"
: []
}
}
#号与$区别
#号表示参数,$代表一个字符串。
select a,b,c from table1 where id=#value#
传入参数后如:value=
"1"
,
则可生成:select a,b,c from table1 where id=‘
1
’。
select a,b,c from table1 where city like
'%$value$%'
传入参数后:value=
"berg"
,
则可生成:select a,b,c from table1 where city like
'%berg%'
。
${} 为原样输出,你传什么,sql里就填入什么。比如有引号它也会原样填到sql里。
#{} 会使用 PreparedStatement,变量处用 ? 代替。 在能使用 #{} 尽量使用它吧,可以防止sql注入。
Mybatlis SQL 注入与防范的更多相关文章
- 常见sql注入的防范总结
在平时的开发过程中,我们可能很少会刻意的去为项目做一个sql注入的防范,这是因为你可能因为使用了某些框架,而无意间已经有了对应sql注入的一些防范操作(比如mybatis使用#{XX}传参,属于预编译 ...
- Java开发工程师(Web方向) - 03.数据库开发 - 第3章.SQL注入与防范
第3章--SQL注入与防范 SQL注入与防范 经常遇到的问题:数据安全问题,尤其是sql注入导致的数据库的安全漏洞 国内著名漏洞曝光平台:WooYun.org 数据库泄露的风险:用户信息.交易信息的泄 ...
- PHP SQL注入的防范
说到网站安全就不得不提到SQL注入(SQL Injection),如果你用过ASP,对SQL注入一定有比较深的理解,PHP的安全性相对较高,这是因为MYSQL4以下的版本不支持子语句,而且当php.i ...
- php web开发安全之sql注入和防范:(一)简单的select语句注入和防范
sql注入主要是指通过在get.post请求参数中构造sql语句,以修改程序运行时所执行的sql语句,从而实现获取.修改信息甚至是删除数据的目的,sql被注入的原因主要是代码编写的有问题(有漏洞),只 ...
- PHP 关于SQL注入的防范措施。
最近在使用框架的时候还是有点不安,不知道框架的设计者有没有考虑到SQL-Injection的问题,我在顶层需不需要做一些必要的过滤等等,由 此我特意的去StackOverflow看了下,真是获益良多, ...
- sql 注入的防范(一)
为了保证程序的健壮性,我们必须对用户输入的数据做有效性验证,防止用户恶意提交数据. 关于防止 sql 注入 我主要从三个方面入手: 1.确认为正整数的,强制转化为int,$id =$_GET('id ...
- SQL注入与防范
首先给大家看个例子: 1)小编首先在数据库中建立了一张测试表logintable,表内有一条测试信息: 然后写了个测试程序: package com.java.SqlInject; import ja ...
- MySQL 及 SQL 注入与防范方法
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的, ...
- MySQL防范SQL注入风险
MySQL防范SQL注入风险 0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本 ...
随机推荐
- vue set
Vue 可以通过数组变异的方法可以控制数组的增减,却不能更改数组及对象,vue可以通过set方法改变数组的长度,改变某项的值,在组件中可以使用$set方法改变数组长度和某项的值 调用方法:Vue.se ...
- 在maven中classpath notfund
- RecyclerView的单击和长按事件(转)
转自:http://www.jianshu.com/p/f2e0463e5aef 前言 上一篇文章揭开RecyclerView的神秘面纱(一):RecyclerView的基本使用中,主要讲述了Recy ...
- 截图软件FastStone
屏幕截图软件(FastStone Capture) 好用,可以粘贴 / 复制. 可以做页面设计,有屏幕标尺,取色器.
- GIT 命令集
Git图形化界面 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remot ...
- 彻底弄懂tf.Variable、tf.get_variable、tf.variable_scope以及tf.name_scope异同
https://blog.csdn.net/qq_22522663/article/details/78729029 1. tf.Variable与tf.get_variabletensorflow提 ...
- 2018蓝桥杯 全球变暖(dfs)
你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示:........##.....##........##...####....###.. ...
- Inno Setup安装程序单例运行
1.源起: KV项目下载底层升级包,老是报出升级文件占用问题,反复分析,不得其所. 今天突然发现同时启动多个升级程序实例,分析认为安装包同时被调用多次,引发实例访问文件冲突,导致此问题. 安装程序由I ...
- win10装回win7。PE下把原来的系统盘格掉,再安装hdd,重启就好了
win10装回win7.安装文件解压到某盘根目录,然后 PE下把原来的系统盘格掉,再安装hdd,重启就好了
- cpio解压initramfs.img
一.解压initramfs.img # mkdir test # cp /boot/initramfs.img /test # cd test # file initramfs.img initram ...