public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
HttpServletRequest orgRequest = null;
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
orgRequest = request;
}
/**
* 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
*/
@Override
public String getParameter(String name) {
String value = super.getParameter(stripXSS(name));
if (value != null) {
value = xssEncode(value);
value = stripXSS(value);
}
return value;
}
/**
* 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
* 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
* getHeaderNames 也可能需要覆盖
*/
@Override
public String getHeader(String name) {
String value = super.getHeader(stripXSS(name));
if (value != null) {
value = stripXSS(value);
value = xssEncode(value);
}
return value;
}
/**
* 将容易引起xss漏洞的半角字符直接替换成全角字符
*
* @param s
* @return
*/
private static String xssEncode(String s) {
if (s == null || s.isEmpty()) {
return s;
}
StringBuilder sb = new StringBuilder(s.length() + 16);
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
/*case '>':
sb.append(">");// 转义大于号
break;
case '<':
sb.append("<");// 转义小于号
break;
case '\'':
sb.append("'");// 转义单引号
break;
case '\"':
sb.append(""");// 转义双引号
break;
case ';':
sb.append(";");// 转义&
break;*/
default:
sb.append(c);
break;
}
}
return sb.toString();
}
private String stripXSS(String value) {
if (value != null) {
// Avoid anything between script tags
Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid anything in a
// expression
scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
// Remove any lonesome </script> tag
scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
value = scriptPattern.matcher(value).replaceAll("");
// Remove any lonesome <script ...> tag
scriptPattern = Pattern.compile("<script(.*?)>",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid eval(...) expressions
scriptPattern = 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:... expressions
scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid vbscript:... expressions
scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid onload= expressions
scriptPattern = Pattern.compile("onload(.*?)=",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid alert()
scriptPattern = Pattern.compile("alert\\((.*?)\\)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid confirm()
scriptPattern = Pattern.compile("confirm\\((.*?)\\)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid prompt()
scriptPattern = Pattern.compile("prompt\\((.*?)\\)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid onfocus()
scriptPattern = Pattern.compile("onfocus\\((.*?)\\)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid onmouseover()
scriptPattern = Pattern.compile("onmouseover\\((.*?)\\)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid onerror()
scriptPattern = Pattern.compile("onerror\\((.*?)\\)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
// Avoid xss()
scriptPattern = Pattern.compile("/xss/",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
value = scriptPattern.matcher(value).replaceAll("");
}
return value;
}
/**
* 获取最原始的request
*
* @return
*/
public HttpServletRequest getOrgRequest() {
return orgRequest;
}
/**
* 获取最原始的request的静态方法
*
* @return
*/
public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
if (req instanceof XssHttpServletRequestWrapper) {
return ((XssHttpServletRequestWrapper) req).getOrgRequest();
}
return req;
}
}
相关推荐
一、什么是XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如...
PDF文件XSS攻击问题主要指的是攻击者通过构造恶意的PDF文档,利用其中的脚本语言功能,尝试在用户的浏览器上执行跨站脚本攻击(XSS)。这种攻击方式可能导致敏感信息泄露、用户权限滥用或其他安全风险。在SpringBoot...
在本实例"XSS攻击实例1"中,我们将探讨这种攻击的原理、类型以及如何在Asp.net框架下预防。 XSS攻击主要分为三类:反射型XSS、存储型XSS和DOM型XSS。反射型XSS是通过诱使用户点击含有恶意参数的链接,将脚本插入到...
XSS攻击是指攻击者通过在网页中嵌入恶意脚本代码,当其他用户浏览该网页时,恶意代码会执行,导致用户信息泄露、网站内容篡改等问题。而SQL注入攻击则是通过在Web应用的数据库查询接口输入恶意的SQL语句,以达到控制...
网站开发者和系统管理员需要对这类攻击有所了解,并采取有效的措施,比如输入输出的严格验证、使用HTTP头的安全措施、以及提醒用户使用安全的浏览器和插件来预防XSS攻击。普通用户也应该提高安全意识,不随意点击...
XSS攻击通常通过注入恶意代码到网页中,当用户浏览这些页面时,代码被执行,可能导致数据泄露、会话劫持等严重后果。为了解决这个问题,开发者可以使用特定的库和工具来防止XSS攻击,如在给定的压缩包中包含的"antlr...
总的来说,了解和预防XSS攻击对于任何Web开发者来说都是至关重要的,因为它们直接关系到用户的安全和信任。通过学习和实践"web安全之XSS攻击demo",你可以更深入地理解XSS的工作原理,并掌握有效的防御策略。
本文将深入探讨如何在Java后端进行预防XSS攻击的策略。 1. **理解XSS类型**: - **存储型XSS**:攻击者的脚本被存储在服务器上,如论坛帖子、评论等,当其他用户访问这些内容时,恶意脚本会被执行。 - **反射型...
SpringBoot是一个流行的Java微服务框架,而ESAPI(Enterprise Security API)则是一个开源的安全库,旨在提供一种简便的方式来防御多种Web应用安全问题,包括XSS攻击。本实战代码将展示如何结合SpringBoot和ESAPI来...
预防xss攻击,过滤标签.js
XSS攻击的类型主要包括三种:反射型XSS、存储型XSS和DOM型XSS。反射型XSS是通过诱使用户点击含有恶意脚本的链接,然后在当前页面上执行;存储型XSS则更为严重,因为恶意脚本被存储在服务器上,任何访问该页面的用户...
**XSS跨站脚本攻击漏洞修复方法** XSS(Cross-Site Scripting)跨站脚本攻击是一种常见的网络安全威胁,它允许攻击者在用户的浏览器上执行恶意代码...记住,预防始终优于治疗,对于XSS攻击,预防措施的到位至关重要。
XSS(跨站脚本攻击)是一种常见的网络攻击...通过深入分析案例,理解攻击机理,并采取有效的预防措施,可以大大降低XSS攻击带来的风险。同时,随着技术的发展,还需要不断地更新和改进防御策略,以适应新的安全威胁。
面对XSS攻击的威胁,开发者和安全专家必须采取一系列的预防措施: 1. **输入验证**:对用户输入的所有数据进行严格的验证和清理,确保不会引入潜在的恶意脚本。 2. **输出编码**:在将用户数据输出到网页前,对其...
第8章 防御XSS攻击,介绍了一些防范XSS攻击的方法,例如,运用XSS Filter进行输入过滤和输出编码,使用Firefox浏览器的Noscript插件抵御XSS攻击,使用HTTP-only的Cookies同样能起到保护敏感数据的作用。
在C#开发中,防止XSS攻击是保证Web应用安全的重要环节。这个压缩包文件“AntiXss”很可能包含了一些用于防御XSS攻击的C#代码示例。 首先,我们需要理解XSS的类型:反射型XSS、存储型XSS和DOM型XSS。反射型XSS是通过...
为了防御XSS攻击,网站开发者应当采取一系列预防措施。例如,对用户输入进行严格的验证和过滤,避免直接将用户输入内容嵌入到网页中,或者至少对这些内容进行编码处理。此外,保持网站的框架、插件、库等组件及时...
XSS攻击的防御措施包括服务器端的预防,如输出编码htmlentities()、使用httponly、限制来源IP、输入验证(类型、长度、正则表达式、白名单、黑名单等),以及富文本框的防御措施,如使用白名单和黑名单等。...
第5章 XSS Worm,讲解了Web 2.0的最大威胁——跨站脚本蠕虫,剖析了Web 2.0相关概念和其核心技术,这些知识对于理解和预防XSS Worm十分重要。第6章 Flash应用安全,就当前的Flash应用安全做出了深入阐述。第7章 深入...