首页 > 代码库 > SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字符
SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字符
最近项目在做整改,将所有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注入
SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字符
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。