加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

彻底干掉恶心的SQL注入裂痕, 一扫而空!

发布时间:2019-07-28 09:04:31 所属栏目:编程 来源:佚名
导读:简介 文章首要内容包罗: Java 耐久层技能/框架简朴先容 差异场景/框架下易导致 SQL 注入的写法 怎样停止和修复 SQL 注入 JDBC 先容 JDBC: 全称 Java Database Connectivity 是 Java 会见数据库的 API,不依靠于特定命据库 ( database-independent ) 全部

bind 部门行使 SQL concat() 函数 

  1. <select id="getUserListLikeConcat" resultType="org.example.User">  
  2.         SELECT * FROM user WHERE name LIKE concat ('%', #{name}, '%')  
  3.     </select> 

除了注入题目之外,这里还必要对用户的输入举办过滤,不应承有通配符,不然在表中数据量较多的时辰,假设用户输入为 %%,会举办全表恍惚查询,严峻环境下可导致 DOS

参考:

http://www.tothenew.com/blog/sql-wildcards-is-your-application-safe

IN 前提

  •  行使 <foreach> 和 #{}
  •  Mapper 接口要领   
  1. List<User> getUserListIn(@Param("nameList") List<String> nameList); 

xml 设置文件 

  1. <select id="selectUserIn" resultType="com.exaple.User">  
  2.       SELECT * FROM user WHERE name in  
  3.       <foreach item="name" collection="nameList"   
  4.                open="(" separator="," close=")">  
  5.             #{name}  
  6.       </foreach>  
  7.     </select> 

详细可参考

http://www.mybatis.org/mybatis-3/dynamic-sql.html

foreach 部门

limit 语句

  •  直接行使 #{} 即可
  •  Mapper 接口要领   
  1. List<User> getUserListLimit(@Param("offset") int offset, @Param("limit") int limit); 

xml 设置文件 

  1. <select id="getUserListLimit" resultType="org.example.User">  
  2.        SELECT * FROM user limit #{offset}, #{limit}  
  3.    </select> 

JPA & Hibernate

先容

JPA:

  •  全称 Java Persistence API
  •  ORM (object-relational mapping) 耐久层 API,必要有详细的实现

更多请参考:

https://en.wikipedia.org/wiki/JavaPersistenceAPI

Hibernate:

  •  JPA ORM 实现

更多请参考 http://hibernate.org。

声名

这里有一种错误的熟悉,行使了 ORM 框架,就不会有 SQL 注入。而现实上,在 Hibernate 中,支持 HQL (Hibernate Query Language) 和 native sql 查询,前者存在 HQL 注入,后者和之前 JDBC 存在沟通的注入题目,来详细看一下。

HQL

HQL 查询例子 

  1. Query<User> query = session.createQuery("from User where name = '" + name + "'", User.class);  
  2.     User user = query.getSingleResult(); 

这里的 User 为类名,和原生 SQL 相同,拼接会导致注入。

正确的用法:

  •  位置参数 (Positional parameter)   
  1. Query<User> query = session.createQuery("from User where name = ?", User.class);  
  2.     query.setParameter(0, name); 
  •  定名参数 (named parameter)   
  1. Query<User> query = session.createQuery("from User where name = :name", User.class);  
  2.    query.setParameter("name", name); 
  •  定名参数 list (named parameter list)   
  1. Query<User> query = session.createQuery("from User where name in (:nameList)", User.class);  
  2.    query.setParameterList("nameList", Arrays.asList("lisi", "zhaowu")); 
  •  类实例 (JavaBean)   
  1. User user = new User();  
  2.    user.setName("zhaowu");  
  3.    Query<User> query = session.createQuery("from User where name = :name", User.class);  
  4.    // User 类必要有 getName() 要领  
  5.    query.setProperties(user); 

Native SQL

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读