防止XSS Attack攻击的解决方案

2024-08-20 17:18

本文主要是介绍防止XSS Attack攻击的解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求:

1.防止用户RequestBody里面数据包含XSS Attack代码

2.防止用户RequestURL地址中包含XSS Attack代码

解决方案及思路:

1.写个拦截器拦截用户请求,之后正则表达式去过滤RequestBody和RequestURL部分包含恶意攻击的代码。

2.具体代码如下


/*** Project Name: * File Name:SecurityFilter.java* Description: TODO* Copyright: Copyright (c) 2017 * Company:* * @author * @date Mar 19, 2019 4:01:44 PM* @version * @see* @since */import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.regex.Pattern;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ReadListener;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.io.IOUtils;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.stereotype.Component;/*** ClassName: SecurityFilter Description: filter all request* * @author * @version* @see* @since*/
@Component
@ServletComponentScan
public class SecurityFilter implements Filter
{/*** Title: init Description:* * @param filterConfig* @throws ServletException*             (describe the param)* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException{}/*** Title: doFilter Description:* * @param request* @param response* @param chain* @throws IOException* @throws ServletException*             (describe the param)* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse,*      javax.servlet.FilterChain)*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{HttpServletRequest req = new XSSRequestWrapper((HttpServletRequest) request);HttpServletResponse resp = (HttpServletResponse) response;//clean xss attack code in reqeuest bodycleanRequestBody(req, resp);//clean xss attack code in request urlcleanRequsetUrl(req, resp, chain);}/*** Title: destroy Description:(describe the param)* * @see javax.servlet.Filter#destroy()*/@Overridepublic void destroy(){}public class XSSRequestWrapper extends HttpServletRequestWrapper{private final byte[] body;public XSSRequestWrapper(HttpServletRequest request) throws IOException{super(request);body = IOUtils.toString(request.getReader()).getBytes(Charset.forName("UTF-8"));}@Overridepublic BufferedReader getReader() throws IOException{return new BufferedReader(new InputStreamReader(getInputStream()));}@Overridepublic ServletInputStream getInputStream() throws IOException{final ByteArrayInputStream bais = new ByteArrayInputStream(body);return new ServletInputStream(){@Overridepublic int read() throws IOException{return bais.read();}@Overridepublic boolean isFinished(){return false;}@Overridepublic boolean isReady(){return false;}@Overridepublic void setReadListener(ReadListener listener){}};}}/*** * Title: stripXSS Description: replace potential xss attack code with ""* * @exception @see* @since {@inheritDoc}* @param value* @return*/private String stripXSS(String value){if (null != value && !value.isEmpty()){// Avoid anything between script tagsPattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);value = scriptPattern.matcher(value).replaceAll("");scriptPattern = Pattern.compile("src=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Remove any lonesome </script> tagscriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");scriptPattern = Pattern.compile("alert\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);value = scriptPattern.matcher(value).replaceAll("");// Remove any lonesome <script ...> tagscriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid eval(...) expressionsscriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid expression(...) expressions/** scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE |* Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll("");*/// Avoid javascript:... expressionsscriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid vbscript:... expressionsscriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid onload= expressionsscriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");}return value;}/*** * Title: cleanRequsetUrl Description: clean xss attack code of request url.* * @exception @see* @since {@inheritDoc}* @param req* @param resp* @param chain* @throws IOException* @throws ServletException*/private void cleanRequsetUrl(HttpServletRequest req, HttpServletResponse resp, FilterChain chain)throws IOException, ServletException{StringBuffer sb = new StringBuffer();String uri = req.getRequestURI();String queryString = req.getQueryString();String url = uri;if (null != queryString && !queryString.isEmpty()){url = sb.append(uri).append(SecurityConstants.QUESTION_MARK).append(queryString).toString();}String cleanUrl = stripXSS(url);if (null != cleanUrl && !cleanUrl.equals(url)){req.getRequestDispatcher(cleanUrl).forward(req, resp);}else{chain.doFilter(req, resp);}}/*** * Title: cleanRequestBody Description: clean XSS Attack code of request body* * @exception @see* @since {@inheritDoc}* @param req* @param resp* @throws IOException*/private String cleanRequestBody(HttpServletRequest req, HttpServletResponse resp) throws IOException{Reader reader = req.getReader();String payload = IOUtils.toString(reader);String body = stripXSS(payload);System.out.println("body is\n" + body);resp.getWriter().write(body);return body;}
}

遇到的问题:

1.The request was rejected because the URL was not normalized

原因:

1.1 是因为请求地址里面包含"//"

解决方案:

1.2 使用该方法获取请求地址:String uri = req.getRequestURI();而不用req.getRequestURL()。之后我们使用相对路径重新发一个请求即可:req.getRequestDispatcher(cleanUrl).forward(req, resp);

2.为什么不适用resp.sendRedirect(cleanUrl);

原因:

2.1 该方法一般情况下只能重新发一个GET请求,不能发POST或者PUT. 想用该方法发POST请求出去可以自己用JSP实现一个表格,较为麻烦。

解决方案:

用req.getRequestDispatcher(cleanUrl).forward(req, resp); 替换它。

PS:除了过滤用户输入的数据处理XSS以外,还可以 只要遇到XSS Code直接抛错出去,具体怎么处理需要根据需求来。

这篇关于防止XSS Attack攻击的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090687

相关文章

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

web网络安全之跨站脚本攻击(XSS)详解

《web网络安全之跨站脚本攻击(XSS)详解》:本文主要介绍web网络安全之跨站脚本攻击(XSS)的相关资料,跨站脚本攻击XSS是一种常见的Web安全漏洞,攻击者通过注入恶意脚本诱使用户执行,可能... 目录前言XSS 的类型1. 存储型 XSS(Stored XSS)示例:危害:2. 反射型 XSS(Re