假设有SQL语句:Select * From Table where ID in (......)
这里该如何防止注入漏洞呢,无论是拼接还是使用Exec通过动态SQL参数化查询,都无法避免注入问题
客户端传入'aaa');Delete from Table--,就可以把表清了
字符串转义可以解决
这个in里面的条件是通过客户端拼好传过来的,格式是'aa','bb','cc','dd',这里aa,bb...都是32位GUID值,所以长度肯定一样,我能否通过判断字符串通过逗号拆分后,长度相同来过滤一些不合法字符串
@MSky: 传入的肯定是一个字符串数组.如果不是.那就改结构.
然后对每个元素进行字符串转义.这是通用做法.什么情况都能用.
至于长度不长度没啥意义.还不如直接判断是否有非法字符.
@吴瑞祥: 好,那按这个方法改下,这里对每个元素进行转义,有没有资料,具体到都需要对那些字符进行转义
@MSky: 只要把单引号替换成双引号就行了.至于为什么自己想想.
SQL 语句用户执行权限以及关键字语句屏蔽
用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);
我试试你这个,这个写法没见过
额,是java里面spring框架的东西啊
我这里是.net的,没有说清楚
还好我用EF Contains,能注入吗