HQL注入防御

缘由:由于客户方漏扫工具,扫描判断我们系统中动态HQL语句有注入风险。(画外音:其实这些参数都是内部使用的,根本没有外部侵入可能)

 

解决:防御sql注入最好的办法就是预编译

对于参数的很好解决:

HQL参数名称绑定

Query query=session.createQuery(“from User user where user.name=:customername and user:customerage=:age ”);

query.setString(“customername”,name); query.setInteger(“customerage”,age);

 

HQL参数位置邦定:

Query query=session.createQuery(“from User user where user.name=? and user.age =? ”); 

query.setString(0,name); 

query.setInteger(1,age);

setParameter()方法: 

String hql=”from User user where user.name=:customername ”; 

Query query=session.createQuery(hql); 

query.setParameter(“customername”,name,Hibernate.STRING);

setProperties()方法: 

将命名参数与一个对象的属性值绑定在一起
 

Customer customer=new Customer(); customer.setName(“pansl”); 

customer.setAge(80); 

Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”); 

query.setProperties(customer);

setProperties()方法会自动将customer对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名。

但是对于bean的注入怎么办呢???

例如这种:

public Query getQueryFromId(Long id, String segName) {
        StringBuilder sql = new StringBuilder();
        sql.append(" from  " + segName + " WHERE  id = ?1");
        Session session = (Session) em.getDelegate();
        Query query = session.createQuery(StringEscapeUtils.escapeSql(sql.toString()));
        query.setParameter("1", id);
        query.setFirstResult(0);
        query.setMaxResults(1);
        return query;
    }

直接上正题:

try {  
            s=HIbernateUtil.getSession();  
            //使用Criteria接口  
            Criteria c = s.createCriteria(User.class);  
            //对查询添加限制条件,相当于where子句。"name"必须是类中具有的属性  
            //Criteria相当于一个容器,约束可以一直加  
            c.add(Restrictions.eq("name", name)); //等于  
//          c.add(Restrictions.gt("birthday",new Date())); // 大于  
            c.add(Restrictions.lt("birthday",new Date())); // 小于  
            //以上条件之间是and的连接方式,当然也可以用一下的or连接方式  
//          c.add(Restrictions.or(lhs, rhs));or 两个条件  
              
            //Criteria实现分页,hql的方法名基本相同  
            c.setFirstResult(0);// 从哪条开始取  
            c.setMaxResults(10);// 共取多少条  
            List<User> list=c.list(); //executQuery();   
            for(User user:list){  
                System.out.print(user.getName());  
            }  
              
            //如果确定数据最多只有一条,可以使用一下的方法简化代码  
            User u= (User)c.uniqueResult();  
            System.out.print("只有一条数据"+u.getName());  
        } finally {  
            if(s!=null){  
                s.close();  
            }  
        }  

补充说明:如果是修改、删除可以使用参照如下源码

/**
	 * Create an instance of Query for executing a criteria
	 * update query.
	 *
	 * @param updateQuery a criteria update query object
	 * @return the new query instance
	 * @throws IllegalArgumentException if the update query is found to be invalid
	 */
	public Query createQuery(CriteriaUpdate updateQuery);

	/**
	 * Create an instance of Query for executing a criteria
	 * delete query.
	 * @param deleteQuery a criteria delete query object
	 * @return the new query instance
	 * @throws IllegalArgumentException if the delete query isfound to be invalid
	 */
	public Query createQuery(CriteriaDelete deleteQuery);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值