1. 查询retrieve
概念: 多条查询(模糊),使用 <select>
。
parameterType
:参数类型类全名,可以省略。resultType
:返回类型类全名,如果返回类型是List
,则只需要写它的泛型类全名。- SQL语句中,
${value}
是字符串拼接符,一般用于like
后,它不会自动补充单引号:- 如果传入的是String或八大基本数据类型,那么
${}
中的内容必须是value
,而不能是其他。 - 如果传入的是POJO类型,那么那么
${}
中的内容是POJO中对应的属性名。
- 如果传入的是String或八大基本数据类型,那么
配置: mapper/studentMapper.xml 中添加
<select id="retrieveLikeName" resultType="com.joe.pojo.Student">
SELECT `id`,
`stu_name` stuName,
`stu_age` stuAge,
`stu_gender` stuGender,
`stu_info` stuInfo
FROM `student` WHERE `stu_name` like ${value}
</select>
复制代码
源码: junit测试
@Test
public void retrieveLikeName() {
String resources = "mybatis/mybatis-student.xml";
SqlSessionFactory factory = MybatisTool.getSqlSessionFactory(resources);
try (SqlSession session = factory.openSession()) {
List<Student> students;
students= session.selectList("studentSpace.retrieveLikeName", "'%谢%'");
System.out.println(students);
} catch (Exception e) {
e.printStackTrace();
}
}
复制代码
2. 注入漏洞
概念:
- SQL注入是一种常见的WEB漏洞,危害较大,攻击者一旦利用系统中存在的SQL注入漏洞来发起攻击,在条件允许的情况下,不仅可以获取整站数据,还可通过进一步的渗透来获取服务器权限,从而进入内网。
- 注入攻击的本质,是把用户输入的数据当做代码执行,这里有两个关键条件:
- 用户能够控制输入。
- 原本程序要执行的代码,拼接了用户输入的数据。
案例:
- 用户传值为
1
,对应SQL为:
select * from news
where id = 1
复制代码
- 用户传值为
1 and 1 = 2 union (select username, password from admin)"
,对应SQL为:
select * from news
where id = 1 and 1 = 2
union (
select username, userpass from admin
)
复制代码
- 管理员账号密码暴露,攻击成功!
3. mybatis拼接符注入漏洞
概念:
- Mybatis的拼接符有注入漏洞问题,如果研发人员没有对用户输入的内容做过滤,一般能不使用尽量不要使用,如下面的SQL写法:
select * from student where stu_name like '%${value}%'
复制代码
- 如果我传入的值是
'or'
之类的格式,则语句会被拼成如下形式,造成全查,产生注入漏洞。
select * from student where stu_name like '%'or'%'
复制代码
解决方案: 避开拼接符,使用占位符,因为占位符不是单纯的字符串拼接,可以解决注入漏洞问题,当然,这种情况下仍然不能传入 %
作为参数,此时可以通过java端来完成过滤。
select * from student where name like "%"#{?}"%"
select * from student where title like concat('%',#{title}, '%')
复制代码