English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 威盾新闻 >> SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字

 

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

威盾防火墙 2014-12-07

 

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

dao层代码如下

1
2
3
4
5
6
7
//使用了预编译sql
public List<IndvConfigModel> selectConfigBySuffix(String suffix)
{
        String hql = "from IndvConfigModel where configKey like '%'||?||'%'";
 
        return this.selectConfigByHQL(hql, new Object[]{suffix});
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
@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注入


相关内容: 最新内容:
在webshell基础上伪造SQL注入点[2014-12-07]
使用IDS技术防止SQL注入攻击[2014-12-07]
Web环境下SQL注入攻击的检测与防御[2014-12-07]
防护黑客必学招数 SQL注入拦截-MYIIS-VIF助你一臂之力[2014-12-07]
SQL Server 2000的安全配置[2014-12-06]
PHP+MYSQL注入实例与防范措施总结[2014-12-05]
ASP木马Webshell的安全防范解决办法[2014-12-07]
如何用应用交付技术优化Oracle数据库?[2014-12-07]
黑客技巧:Google hacking实现以及应用[2014-12-07]
“小不点”伪装成播放软件下载恶意程序[2014-12-07]
ASP.NET木马及Webshell安全解决方案[2014-12-07]
反向观察 黑客看服务器安全基本配置[2014-12-07]