mybatis的sql中使用$会出现sql注入示例:

模拟简单登录场景:

页面代码:

functionlogin(){//sql注入

var user ={

username :"‘李雪雷3‘ or 1=1",

password :"‘ab0715‘",

}

$.ajax({

url:‘/api/test/login.json‘,

type:"POST",

data: JSON.stringify(user),//将对象序列化成JSON字符串

dataType: "json",

contentType :‘application/json;charset=utf-8‘, //设置请求头信息

async: false,

success:function(result) {debugger;

$("#dis").html(result.data);

},

error:function(xhr, ajaxOptions, thrownError) {debugger;

alert("出错了");

}

})

}

controller:

@RequestMapping("/login")

@ResponseBodypublicBaseResponse login(HttpServletRequest request, HttpServletResponse response, @RequestBody UserParam userParam){try{

User user=userService.selectByCon(userParam);if(user != null){return BaseResponse.successCustom().setData("登录成功").build();

}return BaseResponse.successCustom().setData("登录失败").build();//return BaseResponse.successCustom().setData(returnVal).build();

}catch(Exception e){

e.printStackTrace();return BaseResponse.failedCustom("系统异常").build();

}

}

service接口:

User selectByCon(UserParam userParam);

service实现类:

@OverridepublicUser selectByCon(UserParam userParam) {

User user=userMapper.selectByCon(userParam);returnuser;

}

mapper接口:

User selectByCon(UserParam userParam);

mapper.xml文件:

使用$的sql:

selectfrom user2

where 1=1and username = ${username}

and password = ${password}

数据库用户表user2数据:

运行程序:

编译后的sql:

SELECTusername,

PASSWORDFROMuser2WHERE

1 = 1

AND username = ‘李雪雷3‘

OR 1 = 1

AND PASSWORD = ‘ab0715‘

执行结果:

登录成功:

利用了sql注入漏洞骗过了口令从而登录成功。在账号正确的前提下,密码不管输入什么都能成功登录。

说明:

如果使用$写的sql,我们可以利用sql注入漏洞来进行攻击。如果进行表的删除及数据修改sql注入,而数据库没有备份数据,那将是毁灭性的。

=============================================

使用#的sql:

selectfrom user2

where 1=1and username = #{username}

and password = #{password}

运行程序:

编译后的sql:

SELECTusername,

PASSWORDFROMuser2WHERE

1 = 1

AND username =?AND PASSWORD = ?

加入参数,翻译过来就是:

SELECTusername,

PASSWORDFROMuser2WHERE

1 = 1

AND username = "‘李雷雷3‘ or 1=1"AND PASSWORD = "‘ab0715‘"

执行结果:

说明:

使用#的sql进行了预编译,用?接受参数。如果是字符串的参数,则使用" "双引号括起来,有效防止了sql注入。

=========================================

补充:

预编译的好处:

在执行SQL命令时,有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。

而熟悉JDBC编程的大侠们都会选择使用PreparedStatement对象,主要因为使用预编译对象PreparedStatement时,有以下几个优点:

1、效率高

PreparedStatement可以尽可能的提高访问数据库的性能,我们都知道数据库在处理SQL语句时都有一个预编译的过程,而预编译对象就是把一些格式固定的SQL编译后,存放在内存池中即数据库缓冲池,当我们再次执行相同的SQL语句时就不需要预编译的过程了,只需DBMS运行SQL语句。所以当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,特别是的大型的数据库中,它可以有效的也加快了访问数据库的速度。

2、大大提高代码的可读性和可维护性

例如我们在向数据库插入数据:

一种是使用Statement对象

java.sql.Statement   stmt=conn.createStatement();

stmt.executeUpdate("insert into student (name,id,number,count) values (‘"+var1+"‘,‘"+var2+"‘,"+var3+",‘"+var4+"‘)");   另一种是使用PreparedStatement对象

String  sql ="insert into student values(null,?,?,?)";

java.sql.PreparedStatement pstmt=conn.preparedStatement(sql);

pstmt.setString(1,var1); pstmt.setString(2,var2); pstmt.setString(3,var3); pstmt.setString(4,var4); pstmt.executeUpdate();

使用占位符?代替

将参数与SQL语句分离出来,这样就可以方便对程序的更改和延续,同样,也可以减少不必要的错误。

3、开源防止SQL注入(最主要的)

什么时候使用预编译语句?

一般是在需要反复使用一个SQL语句时才使用预编译语句,预编译语句常常放在一个fo r或者while循环里面使用,通过反复设置参数从而多次使用该SQL语句。为了防止SQL注入漏洞,在某些数据操作中也使用预编译语句。

mysql注入式攻击_mybatis的sql中使用$会出现sql注入示例相关推荐

  1. mysql注入式攻击_SQL的注入式攻击方式和避免方法

    SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行.任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQ ...

  2. mysql逆向工程封装_MyBatis高级应用之逆向工程自动生成SQL语句

    本文以Spring整合MyBatis环境下,介绍MyBatis逆向工程自动生成pojo,mapper,dao的Java类.MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话 ...

  3. SQL中,like的SQL注入防止,使用预编译SQL(?)的写法

    Mysql数据库 str = "and indexNum like concat('%',?,'%')" Oracle str = "like '%' || ? || ' ...

  4. mysql 字符串搜_mysql – 在表中搜索字符串的SQL查询?

    嗨,我想在存储在mysql数据库中的表中搜索特定的字符串.表格结构如下: – +------------------------------------------------------------ ...

  5. mysql替换sql中rank函数_MySQL sql Rank()函数实现

    一字符串类 Ø  Concat函数:连接字符串 Ø  Instr函数:返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) Ø  字符串大小写转换[upper().u ...

  6. 开发项目时mysql常用语句_项目开发中常用到的SQL语句

    1.循环示例 循环示例代码: DECLARE @i intDECLARE 10 ) 10 ) 10001200 BEGINSet 110 )), 4 ) @name select @name Loco ...

  7. php sql中regexp,[NCTF2019]SQLi(regexp注入)

    主页就一个登录框 .把sql语句显示出来了. 再进行一波信息搜集.看看robots.txt 有个hint.txt $black_list = "/limit|by|substr|mid|,| ...

  8. Oracle PL/SQL中的循环处理(sql for循环)

    今年春节算是休了个长假,调整好心态,迎接新一年的挑战. 今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在 ...

  9. oracle sql中月份加1,sql日期有关函数以及oracle日期有关函数

    sql日期函数 -- DATEADD -- 在向指定日期加上一段时间的基础上,返回新的 datetime 值. -- DATEADD ( datepart , number, date ) -- 日期 ...

最新文章

  1. codevs1163访问艺术馆(树形dp)
  2. arrayfunction[LeetCode]Convert Sorted Array to Binary Search Tree
  3. RHEL5搭建apache服务器全过程(四)配置heartbeat和ipvsadm
  4. npm的镜像替换淘宝
  5. python条件表达式有哪几个_Python中条件表达式的评估顺序是什么?
  6. Windows操作系统正版盗版知识简介
  7. iPhone开发:类似iChat的聊天泡泡
  8. 【MiniSTM32_HAL库版本_V1.0】实验1跑马灯代码解释(超详细,适合初识STM32的朋友)
  9. scrapy python中文手册_scrapy 官方文档读完总结
  10. 现代城市生态与环境学
  11. 经方的魅力第二版》读书摘录
  12. 珠心算 详解(C++)
  13. 文人教你说祝福——古语祝福
  14. 【excel】如何进行数据排序
  15. linux命令返回结果保存到文件,Linux终端运行命令及结果同时保存入文件方法总结...
  16. mysql unknown option_在cmd下输入mysql: [ERROR] unknown option '-- '.是什么意思啊,求解
  17. 【SQL】模糊查找(like)
  18. Java多线程类FutureTask源码阅读以及浅析
  19. 基础算法:Hanoi塔(递归)
  20. m数据结构 day5 栈:后进先出,只能在表尾插入和删除的线性表

热门文章

  1. DPDK多线程:EAL pthread和lcore Affinity(F-Stack配置文件的配置参数:lcore_mask、lcore_list)
  2. linux timerfd系列函数总结:timerfd.h
  3. Helpful C Tools:source、executables、debugging and performance tuning
  4. Collection完整内容整理
  5. SpringBoot yml 配置
  6. windows下安装Redis测试
  7. python绘制星空图_【Python】基于某些列删除数据框中的重复值
  8. c语言学习-编写函数计算式子:S=2*1*1!+2*2*2!+……+2n*n!的值。要求编写自定义函数分别求解2n和n!,在编写求解S的函数。
  9. java随机数生成三位数_Java编写一程序编写一程序,实现下面功能.(1)随机产生200个三位的正整数,按每行10个数输出.(2)统计其中偶数和...
  10. ONNX系列七 --- 在Python中使用可移植的ONNX AI模型