mybatis的sql中使用$会出现sql注入示例
mybatis的sql中使用$会出现sql注入示例:
模拟简单登录场景:
页面代码:
function login(){
//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("出错了");
}
})
}
<input type="button" onclick="login()" value="登录" name="sunmitBtn">
controller:
@RequestMapping("/login")
@ResponseBody
public BaseResponse 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实现类:
@Override
public User selectByCon(UserParam userParam) {
User user = userMapper.selectByCon(userParam);
return user;
}
mapper接口:
User selectByCon(UserParam userParam);
mapper.xml文件:
使用$的sql:
<select id="selectByCon" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user2
where 1=1
<if test="username != null" >
and username = ${username}
</if>
<if test="password != null" >
and password = ${password}
</if>
</select>
数据库用户表user2数据:

运行程序:
编译后的sql:
SELECT
username,
PASSWORD
FROM
user2
WHERE
1 = 1
AND username = '李雪雷3'
OR 1 = 1
AND PASSWORD = 'ab0715'
执行结果:

登录成功:

利用了sql注入漏洞骗过了口令从而登录成功。在账号正确的前提下,密码不管输入什么都能成功登录。
说明:
如果使用$写的sql,我们可以利用sql注入漏洞来进行攻击。如果进行表的删除及数据修改sql注入,而数据库没有备份数据,那将是毁灭性的。
=============================================
使用#的sql:
<select id="selectByCon" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user2
where 1=1
<if test="username != null" >
and username = #{username}
</if>
<if test="password != null" >
and password = #{password}
</if>
</select>
运行程序:
编译后的sql:
SELECT
username,
PASSWORD
FROM
user2
WHERE
1 = 1
AND username = ?
AND PASSWORD = ?
加入参数,翻译过来就是:
SELECT
username,
PASSWORD
FROM
user2
WHERE
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注入漏洞,在某些数据操作中也使用预编译语句。
mybatis的sql中使用$会出现sql注入示例的更多相关文章
- pl/sql 中F8执行单行sql
pl/sql中设置: tools->preferences->sql window->AutoSelect statement
- mybatis @Select注解中如何拼写动态sql
@Mapper public interface DemandCommentMapper extends BaseMapper<DemandComment>{ @Select(" ...
- Oracle PL/SQL中的循环处理(sql for循环)
今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在这里说下个人的理解. PL/SQL也和我们常用的编程语言 ...
- MySQL开发篇(5)索引、视图、触发器、SQL中的安全问题、SQL Mode、
一.索引 所有MySQL列类型都可以被索引,对相关列使用索引是提高SELECT操作性能的最佳途径.每种存储引擎(MyISAM.InnoDB.BDB.MEMORY等)对每个表至少支持16个索引,总索引长 ...
- (转)SQL中的ISNULL函数介绍
SQL中有多种多样的函数,下面将为您介绍SQL中的ISNULL函数,包括其语法.注释.返回类型等,供您参考,希望对您学习SQL能够有所帮助. ISNULL 使用指定的替换值替换 NULL. 语法ISN ...
- sql中#与$取值
在mapper.xml中#与$都是用来取值的 <update id="addUrl"> update user_power set url = #{newurl} wh ...
- 15 SQL中的安全问题
SQL中的安全问题 1.SQL注入 demo1: SELECT * FROM user WHERE username = ? AND password ...
- SQL SERVER调优常用方法 sql优化
说起SQL SERVER的调优,我想大伙也很想知道这方面的知识.本人也正在探索的路上,大家有什么好的意见,欢迎一起探讨.研究.博取众人之长,才能扬长避短.本文中的内容主要是摘自<程序员的SQL金 ...
- mybatis动态SQL中的sql片段
在mybatis中通过使用SQL片段可以提高代码的重用性,如下情景: 1.创建动态SQL <sql id="sql_count">select count(*)< ...
随机推荐
- vue项目中遇到的打印,以及处理重新排版后不显示echarts图片问题。
1. 项目中用到的打印 页面: css: 控制好宽度一般A4 我调试的是794px多了放不下,小了填不满.当时多页打印的时候,一定要控制好每一个页面内容显示的高度不要超过一个页面,当然根据自己项目来. ...
- ElementUI 表格表头筛选框的高度设置,超出一定高度,显示滚动条
最近项目发现一个问题table表头筛选的时候,由于筛选内容过多导致弹出框超出屏幕,并且无法滚动,应急的办法是缩小浏览器显示比例让更多内容显示
- sqlserver数据文件位置如何迁移
亲测有效的一种方式: 1.对应的数据库脱机 2.迁移物理文件 3.删除原有实例 4.附加
- radio判断是否为空
isMarital = $('[name="isMarital"]:checked').val(); isMarital == null //当radio选择为空的时候 isMar ...
- 在APP开发设计中,为什么APP开发公司要慎用左右横滑设计?
移动端屏幕越来越大,但用户对内容量的要求也水涨船高.如何在有限的屏幕内透出更多的内容,是设计师们研究的重点. 常用的内容拓展设计有:Y 方向 List 滑动.Z 方向 3D Touch .入口式内容折 ...
- Javascript常用字符串判断函数
[代码] 字符串,函数,Javascript,脚本100 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
- RabbitMQ学习笔记(2)----RabbitMQ简单队列(Hello World)的使用
1. 简单队列结构图 2. 引入依赖 pom.xml文件 <dependency> <groupId>com.rabbitmq</groupId> <arti ...
- Unity 点击屏幕发射射线 代码
1,创建一根射线 2,检查射线与其他物体的碰撞,得到碰撞信息 3,通过碰撞信息对碰撞到的物体进行处理 using System.Collections; using System.Collection ...
- 转载:Vim 配置入门
转载:Vim 配置入门 原文地址:http://www.ruanyifeng.com/blog/2018/09/vimrc.html 作者: 阮一峰 Vim 是最重要的编辑器之一,主要有下面几个优点. ...
- 设置mySql的编码方式为utf-8
检查命令: mysql> show variables like '%char%'; 期望结果: 使用mysql命令设置: 如果仍有编码不是utf8的,请检查配置文件,也可使用mysql命令设置 ...