`
zengshaotao
  • 浏览: 791603 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

XSS攻击预防

 
阅读更多

 

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  

            // e­xpression  

            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(...) e­xpressions  

            scriptPattern = Pattern.compile("eval\\((.*?)\\)",  

                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  

            value = scriptPattern.matcher(value).replaceAll("");  

            // Avoid e­xpression(...) e­xpressions  

            scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)",  

                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  

            value = scriptPattern.matcher(value).replaceAll("");  

            // Avoid javascript:... e­xpressions  

            scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);  

            value = scriptPattern.matcher(value).replaceAll("");  

            // Avoid vbscript:... e­xpressions  

            scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);  

            value = scriptPattern.matcher(value).replaceAll("");  

            // Avoid onload= e­xpressions  

            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攻击和SQL注入XssFilter

    一、什么是XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如...

    关于pdf文件xss攻击问题,配置xssFilter方法

    PDF文件XSS攻击问题主要指的是攻击者通过构造恶意的PDF文档,利用其中的脚本语言功能,尝试在用户的浏览器上执行跨站脚本攻击(XSS)。这种攻击方式可能导致敏感信息泄露、用户权限滥用或其他安全风险。在SpringBoot...

    XSS攻击实例1

    在本实例"XSS攻击实例1"中,我们将探讨这种攻击的原理、类型以及如何在Asp.net框架下预防。 XSS攻击主要分为三类:反射型XSS、存储型XSS和DOM型XSS。反射型XSS是通过诱使用户点击含有恶意参数的链接,将脚本插入到...

    springmvc4配置防止XSS攻击的方法

    XSS攻击是指攻击者通过在网页中嵌入恶意脚本代码,当其他用户浏览该网页时,恶意代码会执行,导致用户信息泄露、网站内容篡改等问题。而SQL注入攻击则是通过在Web应用的数据库查询接口输入恶意的SQL语句,以达到控制...

    xss攻击详解,跨站攻击详解

    网站开发者和系统管理员需要对这类攻击有所了解,并采取有效的措施,比如输入输出的严格验证、使用HTTP头的安全措施、以及提醒用户使用安全的浏览器和插件来预防XSS攻击。普通用户也应该提高安全意识,不随意点击...

    Java防止xss攻击jar包

    XSS攻击通常通过注入恶意代码到网页中,当用户浏览这些页面时,代码被执行,可能导致数据泄露、会话劫持等严重后果。为了解决这个问题,开发者可以使用特定的库和工具来防止XSS攻击,如在给定的压缩包中包含的"antlr...

    web安全之XSS攻击demo

    总的来说,了解和预防XSS攻击对于任何Web开发者来说都是至关重要的,因为它们直接关系到用户的安全和信任。通过学习和实践"web安全之XSS攻击demo",你可以更深入地理解XSS的工作原理,并掌握有效的防御策略。

    java 预防XSS攻击

    本文将深入探讨如何在Java后端进行预防XSS攻击的策略。 1. **理解XSS类型**: - **存储型XSS**:攻击者的脚本被存储在服务器上,如论坛帖子、评论等,当其他用户访问这些内容时,恶意脚本会被执行。 - **反射型...

    SpringBoot +esapi 实现防止xss攻击 实战代码,满满干货

    SpringBoot是一个流行的Java微服务框架,而ESAPI(Enterprise Security API)则是一个开源的安全库,旨在提供一种简便的方式来防御多种Web应用安全问题,包括XSS攻击。本实战代码将展示如何结合SpringBoot和ESAPI来...

    预防xss攻击,过滤标签.js

    预防xss攻击,过滤标签.js

    xss跨站脚本攻击与预防

    XSS攻击的类型主要包括三种:反射型XSS、存储型XSS和DOM型XSS。反射型XSS是通过诱使用户点击含有恶意脚本的链接,然后在当前页面上执行;存储型XSS则更为严重,因为恶意脚本被存储在服务器上,任何访问该页面的用户...

    XSS跨站脚本攻击漏洞修复方法

    **XSS跨站脚本攻击漏洞修复方法** XSS(Cross-Site Scripting)跨站脚本攻击是一种常见的网络安全威胁,它允许攻击者在用户的浏览器上执行恶意代码...记住,预防始终优于治疗,对于XSS攻击,预防措施的到位至关重要。

    一个典型的XSS框架注入攻击的分析和预防.pdf

    XSS(跨站脚本攻击)是一种常见的网络攻击...通过深入分析案例,理解攻击机理,并采取有效的预防措施,可以大大降低XSS攻击带来的风险。同时,随着技术的发展,还需要不断地更新和改进防御策略,以适应新的安全威胁。

    XSS跨站脚本攻击

    面对XSS攻击的威胁,开发者和安全专家必须采取一系列的预防措施: 1. **输入验证**:对用户输入的所有数据进行严格的验证和清理,确保不会引入潜在的恶意脚本。 2. **输出编码**:在将用户数据输出到网页前,对其...

    XSS跨站脚本攻击剖析与防御

    第8章 防御XSS攻击,介绍了一些防范XSS攻击的方法,例如,运用XSS Filter进行输入过滤和输出编码,使用Firefox浏览器的Noscript插件抵御XSS攻击,使用HTTP-only的Cookies同样能起到保护敏感数据的作用。

    AntiXss攻击防止的C#代码文件

    在C#开发中,防止XSS攻击是保证Web应用安全的重要环节。这个压缩包文件“AntiXss”很可能包含了一些用于防御XSS攻击的C#代码示例。 首先,我们需要理解XSS的类型:反射型XSS、存储型XSS和DOM型XSS。反射型XSS是通过...

    网络安全攻击方式XSS初探.pdf

    为了防御XSS攻击,网站开发者应当采取一系列预防措施。例如,对用户输入进行严格的验证和过滤,避免直接将用户输入内容嵌入到网页中,或者至少对这些内容进行编码处理。此外,保持网站的框架、插件、库等组件及时...

    开发安全培训(XSS攻击&SQL;注入).pdf

    XSS攻击的防御措施包括服务器端的预防,如输出编码htmlentities()、使用httponly、限制来源IP、输入验证(类型、长度、正则表达式、白名单、黑名单等),以及富文本框的防御措施,如使用白名单和黑名单等。...

    XSS跨站脚本攻击剖析与防御.pdf

    第5章 XSS Worm,讲解了Web 2.0的最大威胁——跨站脚本蠕虫,剖析了Web 2.0相关概念和其核心技术,这些知识对于理解和预防XSS Worm十分重要。第6章 Flash应用安全,就当前的Flash应用安全做出了深入阐述。第7章 深入...

Global site tag (gtag.js) - Google Analytics