防止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

相关文章

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

Xshell远程连接失败以及解决方案

《Xshell远程连接失败以及解决方案》本文介绍了在Windows11家庭版和CentOS系统中解决Xshell无法连接远程服务器问题的步骤,在Windows11家庭版中,需要通过设置添加SSH功能并... 目录一.问题描述二.原因分析及解决办法2.1添加ssh功能2.2 在Windows中开启ssh服务2

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

SpringBoot嵌套事务详解及失效解决方案

《SpringBoot嵌套事务详解及失效解决方案》在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在SpringBoot中,如果嵌套事务的配置不当,可能会导致事务不生效的问题... 目录什么是嵌套事务?嵌套事务失效的原因核心问题:嵌套事务的解决方案方案一:将嵌套事务方法提取到独立类

Spring Boot实现多数据源连接和切换的解决方案

《SpringBoot实现多数据源连接和切换的解决方案》文章介绍了在SpringBoot中实现多数据源连接和切换的几种方案,并详细描述了一个使用AbstractRoutingDataSource的实... 目录前言一、多数据源配置与切换方案二、实现步骤总结前言在 Spring Boot 中实现多数据源连接

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.