遇到个问题:
DAOpublic List<?> find(String hql) {
   return factory.getCurrentSession().createQuery(hql).list();
}BIZpublic Login getUserByEmail(String name) {
List<?> list = commonDao.find("from Login l where l.name='" + name+ "'");
if (list != null && list.size() > 0)
return (Login) list.get(0);
return null;
}朋友意见:String hql = "select l from Login l where l.name= :name";像我这种情况怎么改?参数怎么加?多谢了!

解决方案 »

  1.   

    你用hibernate,不需要关心sql注入问题."select l from Login l where l.name= :name"相当于"select l from Login l where l.name=?";在下面给name赋值就可以了
      

  2.   

    hibernate如何防不知道,jdbc就用preparedStatement对象就行了,然后前台页面过滤特殊字符。
      

  3.   

    public Login getUserByEmail(String name) {
    List<?> list = commonDao.find("from Login l where l.name='" + name+ "'");
    if (list != null && list.size() > 0)
    return (Login) list.get(0);
    return null;
    }
    我直接传入一个name进去,像我这些不会被sql注入吗?
      

  4.   

    尽量使用占位符。不要使用 + 拼接字符串 首先你要了解SQL注入的原理.也可以在后台屏蔽 单引号。SQL注入攻击的总体思路:
      发现SQL注入位置;
      判断服务器类型和后台数据库类型;
      确定可执行情况
      对于有些攻击者而言,一般会采取sql注入法。下面我也谈一下自己关于sql注入法的感悟。
      注入法:
      从理论上说,认证网页中会有型如:
      select * from admin where username=’XXX’ and password=’YYY’ 的语句,若在正式运行此句之前,如果没有进行必要的字符过滤,则很容易实施SQL注入。
      如在用户名文本框内输入:abc’ or 1=1-- 在密码框内输入:123 则SQL语句变成:
      select * from admin where username=’abc’ or 1=1 and password=’123’ 不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
      猜解法:
      基本思路是:猜解所有数据库名称,猜出库中的每张表名,分析可能是存放用户名与密码的表名,猜出表中的每个字段名,猜出表中的每跫锹寄谌荨?BR>  还有一种方式可以获得你的数据库名和每张表的名。
      就是通过在形如:http://www. .cn/news?id=10’的方式来通过报错获得你的数据库名和表名!
      对于jsp而言我们一般采取一下策略来应对:
      1、PreparedStatement
      如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.
      以下是几点原因
      1、代码的可读性和可维护性.
      2、PreparedStatement尽最大可能提高性能.
      3、最重要的一点是极大地提高了安全性.
      

  5.   

    "select l from Login l where l.name= :name"
     我用的是这种方法。。
      
      

  6.   

    但如果是一个查询的方法,有多个参数,且这些参数可能有值可能为null当为null时,表示用户输入的查询条件中这项没有输入,查询时就不需根据这个过滤查询这样的情况用ORM 框架时,对应的查询语句该怎么写好呢?如:public List searchUser(String uname, String email, String phone, String idNo, String... params){    StringBuffer buf = new StringBuffer();
        buf.append("SELECT u FROM User u WHERE ");
        if(uname != null && !"".equals(uname)){
            buff.append(" u.uname like '" + uname + "'");
        }
        .......
        .......
        .......}这样的情况该怎么防止SQL注入呢?
      

  7.   

    首先谢谢各位的回答!关键是 factory.getCurrentSession().createQuery(hql).list();
    createQuery()此方法只需要传一个HQL语句进去,如果这样写select l from Login l where l.name= :name  怎么样再给name 赋值呢??还请各位高手赐教.....
      

  8.   

    问题解决了:
    String hql="from user u where u.name = ?";
    getCurrentSession().createQuery(hql).setParameter(0,"name").list();
      

  9.   

    防sql注入一般用preparestatment
    也就是占位符。
    另一种解决方案就是使用hibernate
      

  10.   

    晕,,,SQL的拼接有时候是必须的,虽然使用预处理有诸多好处。防SQL注入的根本方法是过虑参数中的特殊符号,如:单引号、空格等