java防止XSS夸张脚本攻击

通过AOP全局处理请求,避免使用@RequestBody导致无法过滤的问题,重写Servlet的getInputStream方法,从ServletRequest获取请求体,从而加强XSS攻击防护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们需要将所有的请求过滤,使用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存
        }
    });

}
}




 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值