bind 部分使用 SQL concat() 函数
- <select id="getUserListLikeConcat" resultType="org.example.User">
- SELECT * FROM user WHERE name LIKE concat ('%', #{name}, '%')
- </select>
除了注入问题之外,这里还需要对用户的输入进行过滤,不允许有通配符,否则在表中数据量较多的时候,假设用户输入为 %%,会进行全表模糊查询,严重情况下可导致 DOS
参考:
http://www.tothenew.com/blog/sql-wildcards-is-your-application-safe
IN 条件
- 使用 <foreach> 和 #{}
- Mapper 接口方法
- List<User> getUserListIn(@Param("nameList") List<String> nameList);
xml 配置文件
- <select id="selectUserIn" resultType="com.exaple.User">
- SELECT * FROM user WHERE name in
- <foreach item="name" collection="nameList"
- open="(" separator="," close=")">
- #{name}
- </foreach>
- </select>
具体可参考
http://www.mybatis.org/mybatis-3/dynamic-sql.html
foreach 部分
limit 语句
- List<User> getUserListLimit(@Param("offset") int offset, @Param("limit") int limit);
xml 配置文件
- <select id="getUserListLimit" resultType="org.example.User">
- SELECT * FROM user limit #{offset}, #{limit}
- </select>
JPA & Hibernate
介绍
JPA:
- 全称 Java Persistence API
- ORM (object-relational mapping) 持久层 API,需要有具体的实现
更多请参考:
https://en.wikipedia.org/wiki/JavaPersistenceAPI
Hibernate:
更多请参考 http://hibernate.org。
说明
这里有一种错误的认识,使用了 ORM 框架,就不会有 SQL 注入。而实际上,在 Hibernate 中,支持 HQL (Hibernate Query Language) 和 native sql 查询,前者存在 HQL 注入,后者和之前 JDBC 存在相同的注入问题,来具体看一下。
HQL
HQL 查询例子
- Query<User> query = session.createQuery("from User where name = '" + name + "'", User.class);
- User user = query.getSingleResult();
这里的 User 为类名,和原生 SQL 类似,拼接会导致注入。
正确的用法:
- 位置参数 (Positional parameter)
- Query<User> query = session.createQuery("from User where name = ?", User.class);
- query.setParameter(0, name);
- Query<User> query = session.createQuery("from User where name = :name", User.class);
- query.setParameter("name", name);
- 命名参数 list (named parameter list)
- Query<User> query = session.createQuery("from User where name in (:nameList)", User.class);
- query.setParameterList("nameList", Arrays.asList("lisi", "zhaowu"));
- User user = new User();
- user.setName("zhaowu");
- Query<User> query = session.createQuery("from User where name = :name", User.class);
- // User 类需要有 getName() 方法
- query.setProperties(user);
Native SQL (编辑:温州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|