U01_06 MyBatis单表多查

1. 查询retrieve

概念: 多条查询(模糊),使用 <select>

  • parameterType:参数类型类全名,可以省略。
  • resultType:返回类型类全名,如果返回类型是 List ,则只需要写它的泛型类全名。
  • SQL语句中,${value} 是字符串拼接符,一般用于 like 后,它不会自动补充单引号:
    • 如果传入的是String或八大基本数据类型,那么 ${} 中的内容必须是 value,而不能是其他。
    • 如果传入的是POJO类型,那么那么 ${} 中的内容是POJO中对应的属性名。

配置: 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}, '%')
复制代码

猜你喜欢

转载自juejin.im/post/5ecb7286f265da770b40c44c