java防止XSS夸张脚本攻击

首先我们需要将所有的请求过滤,使用AOP对每个请求做处理,在使用@RequestBody注解的时候,其框架底层调用了getInputStream()方法,因此我们需要重写该方法

获取请求体,在方法参数中加入ServletRequest参数,(纯手写不易,如有写错的字母请留意)

public static String getBodyString(ServletRequest request){
    StringBuffer sb = new StringBuffer();
    InputStream inputStream = null;
    BufferedReader reader = null;
    try{
        inputStream = request.getInputStream();
        reader = new BufferedReader(new InputStreamReader(inputStream,Charset.forName("UTF-8")));
        String line = "";
    while((line = reader.readLine())!=null){
        sb.append(line);
}
}catch(IOException e){
e.printStackTeace();
}finally{
    if(inputStream != null){
        try{
            inputStream.close();
}catch(IOException e){e.printStackTeace();}
}if(reader != null){
    try{
        reader.close();
        }catch(IOException e){e.printStackTeace();}
}
}
return sb.toString();
}

重写getInputStream()方法:

@Override
public ServletInputStream getInputStream() throws IOException{
    String body = 上面的方法(this.getRequest);//this.getRequest该方法为该类继承HttpServletRequestWrapper类中方法
    ServletInputStream inputStream = null;
    if(StringUtils.isNotEmpty(body)){
        if(isJsonStr(body)){//判断body内容是不是json,该方法自行百度,手写确实较累见谅
            JSON jsonObject = (JSON) JSON.parse(body);
            jsonExec(jsonObject);
            body = jsonObject.toJSONString();
        }else{
            body = cleanXSS(body);//写一个方法,将字符串里面的js脚本全部用""替换,例如"<"、"script"等,全部用replaceAll替换""即可        
    }
        inputStream = new PostServletInputStream(body);
    }
    return inputStream;
}

//对jsonArray和jsonObject做递归处理
private void jsonExec(Object obj){
    if(obj instanceof JSONObject){
        cleanXSSForJsonStr((JSONObject) obj);//对json数据进行处理,取出来再用map存
    }else if(obj instanceof JSONArray){
        JSONArray jsonArray = (JSONArray) obj;
        jsonArray.forEach(array -> {
            if(array instanceof JSONObject || array instanceof JSONArray){
            jsonExec(array);
        }else{
            int index = jsonArray.indexOf(array);
            jsonArray.set(index,cleanXSS(String.valueOf(array)));//同理,取出来用map存
        }
    });

}
}




 

 

 

 

你可能感兴趣的:(java基础)