欢迎投稿

今日深度:

SQL或HQL预编译语句,能够防止SQL注入,但是不能

SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字符,hqlsql


最近项目在做整改,将所有DAO层的直接拼接SQL字符串的代码,转换成使用预编译语句的方式。个人通过写dao层的单元测试,有以下几点收获。

dao层代码如下

//使用了预编译sql
public List<IndvConfigModel> selectConfigBySuffix(String suffix)
{
        String hql = "from IndvConfigModel where configKey like '%'||?||'%'";

        return this.selectConfigByHQL(hql, new Object[]{suffix});
}


单元测试代码和执行结果如下:

@Test
public void testLike()
{
    List<IndvConfigModel> list = dao.selectConfigBySuffix("picQual");
    Assert.assertEquals(list.size(), 2);// 1.true

    list = dao.selectConfigBySuffix("picQua%");
    Assert.assertEquals(list.size(), 2);// 2.true
    
    list = dao.selectConfigBySuffix("pic'Qual");
    Assert.assertEquals(list.size(), 0);//3. true

}

1、第一个断言是true,说明上面的做法,的确能够起到模糊查询的效果 
 
2、第二个断言是true,说明%被认为是模糊匹配,并没有被oracle看成普通的字符。这说明预编译语句,是不能处理参数值中的特殊字符的。遇到%和_这种数据库模糊查询的特殊字符,需要使用者自己转义.
 
 
3、第三个断言没有报异常。说明:预编译语句已经对oracle的特殊字符单引号,进行了转义。即将单引号视为查询内容,而不是字符串的分界符。
 
由于SQL注入其实就是借助于特殊字符单引号,生成or 1= 1这种格式的sql。预编译已经对单引号进行了处理,所以可以防止SQL注入



java的预编译语句集可以防止所有sql注入

是的,预编译有个类是PreparedStatement.
这个类的对象是通过参数?来传值的
例:
String sql = "select * from table where id = ?";
Connection con = .....///这里得到是数据库的连接
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1,id);//这里的数据库语句所用到的参数要被设置的,如果你传入了错的值,或不同类型的值,它在插入到数据库语句中会编译不通过,这也就防止了SQL注入。
 

hibernate可以否防止sql注入

很可惜,如果你是组合hql字符串的话,是防止不了的,要防止的话,也要用占位符,比如
query=session.createQuery("select count(*) from CpUser where id = :id and password = :password");
...
query.setParameter("id".userForm.getId());
...
如果你不想这么做的话,就要自己写一个filter,自动把所有的request参数值处理一下,如特殊字符前加上\,就不会有注入错误了
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/3058.html NewsArticle SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字符,hqlsql 最近项目在做整改,将所有DAO层的直接拼接SQL字符串的代码,转换成使用预编译语句的方式。个人通过写dao层的...
相关文章
    暂无相关文章
评论暂时关闭