会的!我已经测试通过
比如
userForm.getId() 为 1
userForm.getPassword() 为 1' or 1=1 or ID='1
就能避过验证,直接进系统

解决方案 »

  1.   

    用PreparedStatement
    String hql = "select count(*) from CpUser where ID=?...";ps1.setString(1,userForm.getId());
      

  2.   

    tring hql = "select count(*) from CpUser where ID=?...";
    ps1= Connection.prepareStatement(sql);
    ps1.setString(1,userForm.getId());
    ...
    rs=ps1.excuteQuery();
      

  3.   

    避免注入漏洞的根本方法就是不要使用STRING组合SQL,而要使用参数传递的方式!这和使用什么工具,什么框架一点关系都没有!你就是直接使用SQL去做,使用参数的方式也没有任何注入问题,使用楼主这种方式写SQL的是一个很不好的习惯!
      

  4.   

    大多情况下,你可以用preparedStatement,这样是可以避免的;但是有时候实在是很难用preparedStatement,比如某些动态的sql。我曾经自己写了持久框架,就是为了可以防止SQL注入(我这边有些项目要做hack test).我解析我自己的QL,把字符常量内的single quote都给换掉,like里的wild char根据开关变量都换掉。
      

  5.   

    "但是有时候实在是很难用preparedStatement,比如某些动态的sql"这个问题我也正在想,觉得一个个查找换掉很麻烦,有没有更好的办法可以解决?(不用preparedStatement的)
      

  6.   

    你可以使用Hibernate和Spring整合...
      

  7.   

    不用preparedStatement,你数据库里的密码是明码吗?是的话,晕了一般密码要回密一下吧,比如用MD5一下这样它输入注入的一些信息,都要先MD5一下,也就通过不了了如:1' or 1=1进行MD5后变成这样了B102C867D61C4E034BA01040441E5487select userpwd0_.id as id, userpwd0_.userid as userid, userpwd0_.password as password from userpwd userpwd0_ where (userid='EA04' )and(password='B102C867D61C4E034BA01040441E5487' )就不会了
      

  8.   

    晕。这是个HQL语句,不是SQL。不过看起来和SQL是一样的-_-##hibernate中可以使用prepareStatement吗?hibernate本身有没有提供什么样的工具、函数、方法来防止注入式漏洞?如果没有的话,对于这种需要拼出来的HQL应该怎么写?在SQL中我还有一个prepareStatement可以用,在hibernate中呢?
      

  9.   


    robbin给了个回答,放在这里。其实也是占位符
    你这种拼SQL的用法根本就是错误的!应该使用占位符! select count(*) from CpUser where id = :id and password = :password"; 
    ... 
    query.setParameter("id".userForm.getId()); 
    ...
      

  10.   

    如果非要用字符串组合写的话,可以在前端加一个filter, 自动把所有的request参数值处理一下,加上特殊字符前加上\,就不会有注入错误了
      

  11.   

    应该和上面所说的,用PreparedStatement,Hibernate参考手册上有例子:session.createQuery("select count(*) from CpUser where ID = ? and password = ?")
    .setString(0, userForm.getId())
    .setString(1, userForm.getPassword());