造成SQL注入攻击的根本原因在于攻击者可以改变SQL查询的上下文,使程序员原本要作为数据解析的数值,被篡改为命令了。防止SQL注入的方法如下:

    正确使用参数化API进行SQL查询。
    如果构造SQL指令时需要动态加入约束条件,可以通过创建一份合法字符串列表,使其对应于可能要加入到SQL指令中的不同元素,来避免SQL注入攻击。

    1. Query query=session.createQuery("from User user where user.name=:userName ");
    2. query.setString(“userName”,name);
    1. Query query=session.createQuery("from User user where user.name=? ");
    2. query.setString(0, userName);
    1. String hql="from User user where user.name=: userName";
    2. Query query=session.createQuery(hql);
    3. query.setParameter(“userName”,name,Hibernate.STRING);
    1. InputUser inputUser=new InputUser ();
    2. inputUser.setName(“userName”);
    3. Query query=session.createQuery(“from User u where u.name=:name”);
    4. query.setProperties(inputUser);

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