最近项目进行安全测试,用appscan扫描出sql注入,发现在参数后拼入%uFF07这类字符后,过滤器request.getParameterNames()就会有异常(但是捕获不到这个异常),并且自动把带%uFF07的参数key和value自动忽略,也就检测不到有sql注入了,,,这样有个解决方法是可以在过滤器中用request.getInputStream()来获取IO流,即可检测到%,,,但是又有一个问题:getParameterNames()和getInputStream()又不能共存使用,在过滤器中若用getInputStream(),则项目其他地方request.getParameter就会有问题,所以谁有好的办法呢???就是图片中这样,过滤器request.getParameterName()就获取不到"value"属性和对应的值
4 回答

GCT1015
TA贡献1827条经验 获得超4个赞
Parameter [value] with value [1234%uFF07] has been ignored.说明处理参数的值的时候,忽略了。所以

Smart猫小萌
TA贡献1911条经验 获得超7个赞
有个方法可以试一试,写个类继承javax.servlet.http.HttpServletRequestWrapper,重写里面的方法,做转义或者一些其他的操作,在过滤doFilter方法里面, XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);

函数式编程
TA贡献1807条经验 获得超9个赞
public class RequestWrapper extends HttpServletRequestWrapper { HttpServletRequest orgRequest = null; public RequestWrapper(HttpServletRequest request) { super(request); orgRequest = request; } @Override public Map<String,String[]> getParameterMap() { Map<String,String[]> map = new LinkedHashMap(); Map<String,String[]> parameters = super.getParameterMap(); for (String key : parameters.keySet()) { System.out.println("getParameterMap---------得到的key:" + key); String[] values = parameters.get(key); for (int i = 0; i < values.length; i++) { values[i] = XssClean.xssClean(values[i]); } map.put(key, values); } return map; } @Override public Enumeration<String> getParameterNames() { Enumeration enumeration = super.getParameterNames(); String attributeName = ""; while (enumeration.hasMoreElements()) { attributeName = (String) enumeration.nextElement(); getParameterValues(attributeName); } return enumeration; } @Override public String[] getParameterValues(String paramString){ String[] arrayOfString1 = super.getParameterValues(paramString); if (arrayOfString1 == null) { return null; } int i = arrayOfString1.length; String[] arrayOfString2 = new String[i]; for (int j = 0; j < i; j++) { System.out.println("getParameterValues---------得到的key:" + arrayOfString1[j]); arrayOfString2[j] =XssClean.xssClean(arrayOfString1[j]); } return arrayOfString2; } @Override public String getParameter(String paramString){ String str = super.getParameter(paramString); if (str == null) { return null; } return XssClean.xssClean(str); } public String getHeader(String paramString) { String str = super.getHeader(paramString); if (str == null) return null; return XssClean.xssClean(str); } public String getQueryString() { String value = super.getQueryString(); if (value != null) { value = XssClean.xssClean(value); } return value; }
还是运行上面那个有问题的sql注入的请求,输出依旧没有“value”
getParameterMap---------得到的key:id getParameterMap---------得到的key:label getParameterMap---------得到的key:type getParameterMap---------得到的key:description getParameterMap---------得到的key:sort getParameterMap---------得到的key:remarks
添加回答
举报
0/150
提交
取消