mysql注入式攻击_mybatis的sql中使用$会出现sql注入示例
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注入示例相关推荐
- mysql注入式攻击_SQL的注入式攻击方式和避免方法
SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行.任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQ ...
- mysql逆向工程封装_MyBatis高级应用之逆向工程自动生成SQL语句
本文以Spring整合MyBatis环境下,介绍MyBatis逆向工程自动生成pojo,mapper,dao的Java类.MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话 ...
- SQL中,like的SQL注入防止,使用预编译SQL(?)的写法
Mysql数据库 str = "and indexNum like concat('%',?,'%')" Oracle str = "like '%' || ? || ' ...
- mysql 字符串搜_mysql – 在表中搜索字符串的SQL查询?
嗨,我想在存储在mysql数据库中的表中搜索特定的字符串.表格结构如下: – +------------------------------------------------------------ ...
- mysql替换sql中rank函数_MySQL sql Rank()函数实现
一字符串类 Ø Concat函数:连接字符串 Ø Instr函数:返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) Ø 字符串大小写转换[upper().u ...
- 开发项目时mysql常用语句_项目开发中常用到的SQL语句
1.循环示例 循环示例代码: DECLARE @i intDECLARE 10 ) 10 ) 10001200 BEGINSet 110 )), 4 ) @name select @name Loco ...
- php sql中regexp,[NCTF2019]SQLi(regexp注入)
主页就一个登录框 .把sql语句显示出来了. 再进行一波信息搜集.看看robots.txt 有个hint.txt $black_list = "/limit|by|substr|mid|,| ...
- Oracle PL/SQL中的循环处理(sql for循环)
今年春节算是休了个长假,调整好心态,迎接新一年的挑战. 今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在 ...
- oracle sql中月份加1,sql日期有关函数以及oracle日期有关函数
sql日期函数 -- DATEADD -- 在向指定日期加上一段时间的基础上,返回新的 datetime 值. -- DATEADD ( datepart , number, date ) -- 日期 ...
最新文章
- codevs1163访问艺术馆(树形dp)
- arrayfunction[LeetCode]Convert Sorted Array to Binary Search Tree
- RHEL5搭建apache服务器全过程(四)配置heartbeat和ipvsadm
- npm的镜像替换淘宝
- python条件表达式有哪几个_Python中条件表达式的评估顺序是什么?
- Windows操作系统正版盗版知识简介
- iPhone开发:类似iChat的聊天泡泡
- 【MiniSTM32_HAL库版本_V1.0】实验1跑马灯代码解释(超详细,适合初识STM32的朋友)
- scrapy python中文手册_scrapy 官方文档读完总结
- 现代城市生态与环境学
- 经方的魅力第二版》读书摘录
- 珠心算 详解(C++)
- 文人教你说祝福——古语祝福
- 【excel】如何进行数据排序
- linux命令返回结果保存到文件,Linux终端运行命令及结果同时保存入文件方法总结...
- mysql unknown option_在cmd下输入mysql: [ERROR] unknown option '-- '.是什么意思啊,求解
- 【SQL】模糊查找(like)
- Java多线程类FutureTask源码阅读以及浅析
- 基础算法:Hanoi塔(递归)
- m数据结构 day5 栈:后进先出,只能在表尾插入和删除的线性表
热门文章
- DPDK多线程:EAL pthread和lcore Affinity(F-Stack配置文件的配置参数:lcore_mask、lcore_list)
- linux timerfd系列函数总结:timerfd.h
- Helpful C Tools:source、executables、debugging and performance tuning
- Collection完整内容整理
- SpringBoot yml 配置
- windows下安装Redis测试
- python绘制星空图_【Python】基于某些列删除数据框中的重复值
- c语言学习-编写函数计算式子:S=2*1*1!+2*2*2!+……+2n*n!的值。要求编写自定义函数分别求解2n和n!,在编写求解S的函数。
- java随机数生成三位数_Java编写一程序编写一程序,实现下面功能.(1)随机产生200个三位的正整数,按每行10个数输出.(2)统计其中偶数和...
- ONNX系列七 --- 在Python中使用可移植的ONNX AI模型