SQL注射原理

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

攻击方式

猜表名

And (Select count(*) from 表名)<>0
and exists (select * from 表名)

猜列名

And (Select count(列名) from 表名)<>0
and exists (select 列名 from 表名)

拉全表

' 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注入。
 
在用#时,会在数据库里面生成一颗执行树,每一个参数就像是填空题一样被放入这颗执行树中。每次SQL执行时,执行树都是生成好的,不用重复解析SQL。同时也提升了SQL执行效率。

Mybatlis SQL 注入与防范的更多相关文章

  1. 常见sql注入的防范总结

    在平时的开发过程中,我们可能很少会刻意的去为项目做一个sql注入的防范,这是因为你可能因为使用了某些框架,而无意间已经有了对应sql注入的一些防范操作(比如mybatis使用#{XX}传参,属于预编译 ...

  2. Java开发工程师(Web方向) - 03.数据库开发 - 第3章.SQL注入与防范

    第3章--SQL注入与防范 SQL注入与防范 经常遇到的问题:数据安全问题,尤其是sql注入导致的数据库的安全漏洞 国内著名漏洞曝光平台:WooYun.org 数据库泄露的风险:用户信息.交易信息的泄 ...

  3. PHP SQL注入的防范

    说到网站安全就不得不提到SQL注入(SQL Injection),如果你用过ASP,对SQL注入一定有比较深的理解,PHP的安全性相对较高,这是因为MYSQL4以下的版本不支持子语句,而且当php.i ...

  4. php web开发安全之sql注入和防范:(一)简单的select语句注入和防范

    sql注入主要是指通过在get.post请求参数中构造sql语句,以修改程序运行时所执行的sql语句,从而实现获取.修改信息甚至是删除数据的目的,sql被注入的原因主要是代码编写的有问题(有漏洞),只 ...

  5. PHP 关于SQL注入的防范措施。

    最近在使用框架的时候还是有点不安,不知道框架的设计者有没有考虑到SQL-Injection的问题,我在顶层需不需要做一些必要的过滤等等,由 此我特意的去StackOverflow看了下,真是获益良多, ...

  6. sql 注入的防范(一)

    为了保证程序的健壮性,我们必须对用户输入的数据做有效性验证,防止用户恶意提交数据. 关于防止 sql 注入 我主要从三个方面入手: 1.确认为正整数的,强制转化为int,$id  =$_GET('id ...

  7. SQL注入与防范

    首先给大家看个例子: 1)小编首先在数据库中建立了一张测试表logintable,表内有一条测试信息: 然后写了个测试程序: package com.java.SqlInject; import ja ...

  8. MySQL 及 SQL 注入与防范方法

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的, ...

  9. MySQL防范SQL注入风险

    MySQL防范SQL注入风险 0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本 ...

随机推荐

  1. ubuntu16.04 64bit 升级到 python3.6

    https://blog.csdn.net/zhao__zhen/article/details/81584933 https://www.codetd.com/article/1967538 htt ...

  2. 重新装kafka

    Linux搭建kafka   一.安装Java 1.查看linux 的系统版本 root@aliyun:~# uname --m x86_64 2.安装java mkdir -p /usr/local ...

  3. tomcat支持 https

    首先 安装nginx  ,在nginx.conf 中引入 include /app/conf/nginx/vhosts/*.conf; 配置 并在conf/vhosts 目录 中配置virtual.c ...

  4. Trustin Lee

    Trustin Lee,MINA.Netty2通讯框架的作者韩国人,80年出生,8岁起在MSX迷你计算机上编写BASIC程序,爱好游戏编程以及使用汇编.C和C++解决编程问题,1998年获得韩国信息奥 ...

  5. Java 日期时间 Date类型,long类型,String类型表现形式的转换

    Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型 java.util.Date dt = new Date(); ...

  6. vi 基本命令使用

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对 Unix及Linux系统的任何版本,vi编辑器是完全 ...

  7. 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。

    题目: 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数. 思路: 假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢? 解法 ...

  8. openstack(Pike 版)集群部署(六)--- Horizon 部署

    一.介绍 参照官网部署:https://docs.openstack.org/horizon/pike/install/    继续上一博客进行部署:http://www.cnblogs.com/we ...

  9. CentOS 6 UNEXPECTED INCONSISTENCY RUN fsck MANUALLY

    1:按Control-D,系统自动重启: 2:直接输入root的密码进入命令行 3:看网上的介绍需要输入mount |grep “on/” 找到root的分区,我试过后无效 4:直接输入fsck -y ...

  10. vue 使用a+ router.push的形式跳转时,地址栏不显示参数

    解决办法: a链接不要写href 属性