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 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|