Java SQL注入学习笔记
<h1 id="0x01-简介">1 简介 文章主要内容包括:
JDBC:
更多请参考 http://www.oracle.com/technetwork/java/javase/jdbc/index.html 直接使用 JDBC 的场景,如果代码中存在拼接 SQL 语句,那么很有可能会产生注入,如 安全的写法是使用?参数化查询 ( parameterized queries ),即 SQL 语句中使用参数绑定( ? 占位符 ) 和? 还有一些情况,比如 order by、column name,不能使用参数绑定,此时需要手工过滤,如通常 order by 的字段名是有限的,因此可以使用白名单的方式来限制参数值 这里需要注意的是,使用了? 看到这里,大家肯定会好奇? 正常情况下,用户的输入是作为参数值的,而在 SQL 注入中,用户的输入是作为 SQL 指令的一部分,会被数据库进行编译/解释执行。当使用了? 更详细和准确的回答,请参考:
更多请参考 http://www.mybatis.org/ 在 MyBatis 中,使用 XML 文件 或 Annotation 来进行配置和映射,将 interfaces 和 Java POJOs (Plain Old Java Objects) 映射到 database records XML 例子 Mapper Interface XML 配置文件 Annotation 例子 可以看到,使用者需要自己编写 SQL 语句,因此当使用不当时,会导致注入问题 与使用 JDBC 不同的是,MyBatis 使用? 使用? 因此? 而使用? name 值为? 因此建议尽量使用? sortBy 参数值为? 即以字符串 “name” 来排序,而非按照 name 字段排序,详细可参考 https://stackoverflow.com/a/32996866/6467552。 这种情况就需要使用? 使用了?
除了? like 语句 如需要使用通配符 ( wildcard characters?
除了注入问题之外,这里还需要对用户的输入进行过滤,不允许有通配符,否则在表中数据量较多的时候,假设用户输入为? IN 条件 使用? Mapper 接口方法 getUserListIn(@Param("nameList") List
xml 配置文件 具体可参考 http://www.mybatis.org/mybatis-3/dynamic-sql.html?foreach?部分 limit 语句 直接使用? Mapper 接口方法 getUserListLimit(@Param("offset") int offset,@Param("limit") int limit);
xml 配置文件 JPA:
更多请参考 https://en.wikipedia.org/wiki/Java_Persistence_API Hibernate:
更多请参考 http://hibernate.org/ 这里有一种错误的认识,使用了 ORM 框架,就不会有 SQL 注入。而实际上,在 Hibernate 中,支持 HQL (Hibernate Query Language) 和 native sql 查询,前者存在 HQL 注入,后者和之前 JDBC 存在相同的注入问题,来具体看一下 HQL 查询例子 query = session.createQuery("from User where name = '" + name + "'",User.class);
User user = query.getSingleResult();
这里的? 正确的用法:
query = session.createQuery("from User where name = ?",User.class);
query.setParameter(0,name);
query = session.createQuery("from User where name = :name",User.class);
query.setParameter("name",name);
query = session.createQuery("from User where name in (:nameList)",User.class);
query.setParameterList("nameList",Arrays.asList("lisi","zhaowu"));
query = session.createQuery("from User where name = :name",User.class);
// User 类需要有 getName() 方法
query.setProperties(user);
存在 SQL 注入 使用参数绑定来设置参数值 JPA 中使用 JPQL (Java Persistence Query Language),同时也支持 native sql,因此和 Hibernate 存在类似的问题,这里就不再细说,感兴趣的可以参考? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |