首页 新闻 会员 周边 捐助

关于使用in条件时SQL的注入漏洞如何解决

0
[已解决问题] 解决于 2017-07-07 17:35

假设有SQL语句:Select * From Table where ID in (......)

这里该如何防止注入漏洞呢,无论是拼接还是使用Exec通过动态SQL参数化查询,都无法避免注入问题

客户端传入'aaa');Delete from Table--,就可以把表清了

MSky的主页 MSky | 菜鸟二级 | 园豆:436
提问于:2017-07-05 10:04
< >
分享
最佳答案
0

字符串转义可以解决

奖励园豆:5
吴瑞祥 | 高人七级 |园豆:29449 | 2017-07-05 10:11

 这个in里面的条件是通过客户端拼好传过来的,格式是'aa','bb','cc','dd',这里aa,bb...都是32位GUID值,所以长度肯定一样,我能否通过判断字符串通过逗号拆分后,长度相同来过滤一些不合法字符串

MSky | 园豆:436 (菜鸟二级) | 2017-07-05 10:21

@MSky: 传入的肯定是一个字符串数组.如果不是.那就改结构.

然后对每个元素进行字符串转义.这是通用做法.什么情况都能用.

至于长度不长度没啥意义.还不如直接判断是否有非法字符.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-07-05 10:34

@吴瑞祥: 好,那按这个方法改下,这里对每个元素进行转义,有没有资料,具体到都需要对那些字符进行转义

MSky | 园豆:436 (菜鸟二级) | 2017-07-05 10:36

@MSky: 只要把单引号替换成双引号就行了.至于为什么自己想想.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-07-05 11:21
其他回答(3)
0

SQL 语句用户执行权限以及关键字语句屏蔽

hahanonym | 园豆:1460 (小虾三级) | 2017-07-05 10:09
0

用namedParameterJdbcTemplate的参数化查询也不行吗?我一直是这么用的,公司的安全扫描没有扫出问题来,类似这样:

       String sql = "UPDATE ora_check_result SET sync_status=:status WHERE tid IN (:tids)";
        Map<String, Object> params = Maps.newHashMap();
        params.put("tids", tids);
        params.put("status", status);
        return namedParameterJdbcTemplate.update(sql, params); 
苍枫露雨 | 园豆:1027 (小虾三级) | 2017-07-05 10:13

 我试试你这个,这个写法没见过

支持(0) 反对(0) MSky | 园豆:436 (菜鸟二级) | 2017-07-05 10:23

 额,是java里面spring框架的东西啊

支持(0) 反对(0) MSky | 园豆:436 (菜鸟二级) | 2017-07-05 10:29

 我这里是.net的,没有说清楚

支持(0) 反对(0) MSky | 园豆:436 (菜鸟二级) | 2017-07-05 10:29
0

还好我用EF Contains,能注入吗

0539 | 园豆:442 (菜鸟二级) | 2019-05-20 11:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册