一、什么是SQL注入?
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。
二、SQL注入总体思路
1、寻找到SQL注入的位置
2、判断服务器类型和后台数据库类型
3、针对不通的服务器和数据库特点进行SQL注入攻击
三、登录举例
SQL语句
String sql="select * from table where username='"+userName+"’and password='"+password+” '”;
select * from sys_user where user_name = ${username} and ${password}
测试输入 可查询到该表所有数据
SELECT * FROM table WHERE username='1’or 1=1 # and password=''
加上limit(分页) 可以直接查询到单点数据 加上 # 直接注释掉后面的sql语句 这样就导致了sql入侵
SELECT * FROM table WHERE username='1’or 1=1 limit 1 # and password=''
四、怎么防止sql注入?
1、不要图一时方便使用SQL语句直接拼接。
2、如果用SQL语句,那就使用参数化,添加Param。
3、尽可能的使用存储过程,安全性能高而且处理速度也快。
4、屏蔽SQL注入。
5、使用Mybatis的时候将 $ 替换成 #
五、#{}与${}的基本概念
在MyBatis中,
#{}
和${}
都用于参数绑定,但它们的处理方式有所不同:
#{}
用于预编译,可以防止SQL注入攻击,通常用于动态拼接SQL语句中的值。
${}
直接替换成相应的参数值,可以用于动态拼接SQL语句中的列名、表名等不需要预编译的部分。
详细可查看该篇文章:深入解析MyBatis中#{}与${}的区别:从源码角度揭秘底层实现原理-阿里云开发者社区 (aliyun.com)
六、真题例子
Mybatis $ 和 # 的区别
相同点:
都能取到变量
不同点:
#可以实现预编译,会先把#{变量}编译成?,在执行时再取值,可以有效防止sql注入
$直接进行字符串替换
MyBatis关键流程
1. 初始化过程
MyBatis的初始化过程包括解析配置文件、创建SqlSessionFactory、加载映射器文件等步骤。在初始化过程中,MyBatis会读取配置文件中的信息,并根据配置信息创建相应的对象。
2. SQL语句处理流程
SQL语句处理流程包括SQL语句的解析、参数绑定、SQL语句的执行等步骤。在执行SQL语句时,MyBatis会根据映射器接口的方法名查找相应的SQL语句,并将参数绑定到SQL语句中,最终执行SQL语句并返回结果。
3. 缓存机制
MyBatis提供了一级缓存和二级缓存两种缓存机制,用于提高SQL查询的性能。一级缓存是SqlSession级别的缓存,二级缓存是Mapper级别的缓存。MyBatis会根据配置信息自动管理缓存的生命周期,并在需要时自动更新缓存中的数据。