设为首页 加入收藏

TOP

SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字符
2015-07-24 11:04:59 来源: 作者: 【 】 浏览:1
Tags:SQL HQL 编译 语句 能够 防止 注入 但是 不能 处理 特殊 字符

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

dao层代码如下

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

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

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

@Test
public void testLike()
{
    List 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注入

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇常用sqlserver语句命令 下一篇NoSQL数据库之Redis数据库:Redis..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Java 学习线路图是怎 (2025-12-25 15:19:15)
·关于 Java 学习,有 (2025-12-25 15:19:12)
·有没有Java swing教 (2025-12-25 15:19:09)
·Start, Stop, and Di (2025-12-25 14:50:57)
·C语言入门教程:零基 (2025-12-25 14:50:54)