`

java 防止 XSS 攻击的常用方法总结.

阅读更多

 

java web应用程序防止 csrf 攻击的方法,参考这里 java网页程序采用 spring 防止 csrf 攻击. ,但这只是攻击的一种方式,还有其他方式,比如今天要记录的 XSS 攻击, XSS 攻击的专业解释,可以在网上搜索一下,参考百度百科的解释 http://baike.baidu.com/view/2161269.htm, 但在实际的应用中如何去防止这种攻击呢,下面给出几种办法.
1. 自己写 filter 拦截来实现,但要注意的时,在WEB.XML 中配置 filter 的时候,请将这个 filter 放在第一位.
2. 采用开源的实现 ESAPI library ,参考网址:https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

3. 可以采用spring 里面提供的工具类来实现.

一, 第一种方法。
配置过滤器

publicclassXSSFilterimplementsFilter{
    @Override
    publicvoid init(FilterConfig filterConfig)throwsServletException{
    }
    @Override
    publicvoid destroy(){
    }
    @Override
    publicvoid doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
        throwsIOException,ServletException{
        chain.doFilter(newXSSRequestWrapper((HttpServletRequest) request), response);
    }}



再实现 ServletRequest 的包装类

import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;publicclassXSSRequestWrapperextendsHttpServletRequestWrapper{
    publicXSSRequestWrapper(HttpServletRequest servletRequest){
        super(servletRequest);
    }
    @Override
    publicString[] getParameterValues(String parameter){
        String[] values =super.getParameterValues(parameter);
        if(values ==null){
            returnnull;
        }
        int count = values.length;
        String[] encodedValues =newString[count];
        for(int i =0; i < count; i++){
            encodedValues[i]= stripXSS(values[i]);
        }
        return encodedValues;
    }
    @Override
    publicString getParameter(String parameter){
        String value =super.getParameter(parameter);
        return stripXSS(value);
    }
    @Override
    publicString getHeader(String name){
        String value =super.getHeader(name);
        return stripXSS(value);
    }
    privateString stripXSS(String value){
        if(value !=null){
            // NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to
            // avoid encoded attacks.
            // value = ESAPI.encoder().canonicalize(value);
            // Avoid null characters
            value = value.replaceAll("","");
            // Avoid anything between script tags
            Pattern scriptPattern =Pattern.compile("(.*?)",Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid anything in a src="http://www.yihaomen.com/article/java/..." type of 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  tag
            scriptPattern =Pattern.compile("",Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Remove any lonesome  tag
            scriptPattern =Pattern.compile("",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("");
        }
        return value;
    }}



例子中注释的部分,就是采用 ESAPI library 来防止XSS攻击的,推荐使用.

当然,我还看到这样一种办法,将所有的编程全角字符的解决方式,但个人觉得并没有上面这种用正则表达式替换的好

privatestaticString xssEncode(String s){
        if(s ==null|| s.equals("")){
            return s;
        }
        StringBuilder sb =newStringBuilder(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('\\');
                sb.append('\'');
                sb.append('\\');
                sb.append('\'');
                break;
            case'\"':
                sb.append('\\');
                sb.append('\"');// 全角双引号
                break;
            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();
    }



当然,还有如下更简单的方式:

privateString cleanXSS(String value){
                //You'll need to remove the spaces from the html entities below
        value = value.replaceAll("<","& lt;").replaceAll(">","& gt;");
        value = value.replaceAll("\\(","& #40;").replaceAll("\\)","& #41;");
        value = value.replaceAll("'","& #39;");
        value = value.replaceAll("eval\\((.*)\\)","");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']","\"\"");
        value = value.replaceAll("script","");
        return value;
    }



在后台或者用spring 如何实现呢:
首先添加一个jar包:commons-lang-2.5.jar ,然后在后台调用这些函数:

StringEscapeUtils.escapeHtml(string);StringEscapeUtils.escapeJavaScript(string);StringEscapeUtils.escapeSql(string);



当然,我记得在spring 里面好像有一个 HtmlUtils.htmlEscape , 同样可以做到 过滤 XSS 攻击。从上面的介绍可以看出,防止 XSS 攻击并不难,就是要小心。

===============================================================

在apache commons-lang(2.3以上版本)中为我们提供了一个方便做转义的工具类,主要是为了防止sql注入,xss注入攻击的功能。总共提供了以下几个方法:

 

1.escapeSql 提供sql转移功能,防止sql注入攻击,例如典型的万能密码攻击' ' or 1=1 ' '

  1. StringBuffer sql = new StringBuffer("select key_sn,remark,create_date from tb_selogon_key where 1=1 ");  
  2.         if(!CommUtil.isEmpty(keyWord)){  
  3.             sql.append(" and like '%" + StringEscapeUtils.escapeSql(keyWord) + "%'");  
  4.         }  
StringBuffer sql = new StringBuffer("select key_sn,remark,create_date from tb_selogon_key where 1=1 ");
		if(!CommUtil.isEmpty(keyWord)){
			sql.append(" and like '%" + StringEscapeUtils.escapeSql(keyWord) + "%'");
		}

2.escapeHtml /unescapeHtml  转义/反转义html脚本

  1. System.out.println(StringEscapeUtils.escapeHtml("<a>dddd</a>"));     
  2. 输出结果为:&lt;a&gt;dddd&lt;/a&gt;  
System.out.println(StringEscapeUtils.escapeHtml("<a>dddd</a>"));   
输出结果为:&lt;a&gt;dddd&lt;/a&gt;
  1. System.out.println(StringEscapeUtils.unescapeHtml("&lt;a&gt;dddd&lt;/a&gt;"));     
  2. 输出为:<a>ddd</a>  
System.out.println(StringEscapeUtils.unescapeHtml("&lt;a&gt;dddd&lt;/a&gt;"));   
输出为:<a>ddd</a>

3.escapeJavascript/unescapeJavascript 转义/反转义js脚本

  1. System.out.println(StringEscapeUtils.escapeJavaScript("<script>alert('1111')</script>"));     
  2. 输出为:&lt;script&gt;alert('111')&lt;/script&gt;  
System.out.println(StringEscapeUtils.escapeJavaScript("<script>alert('1111')</script>"));   
输出为:&lt;script&gt;alert('111')&lt;/script&gt;

4.escapeJava/unescapeJava 把字符串转为unicode编码

  1. System.out.println(StringEscapeUtils.escapeJava("中国"));     
  2. 输出为:用escapeJava方法转义之后的字符串为:/u4E2D/u56FD/u5171/u4EA7/u515A  

==============================================

  apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils,这个工具类是在2.3版本以上加上的去的,利用它能很方便的进行html,xml,java等的转义与反转义,而且还能对关键字符串进行处理预防SQL注入,不过好像common-lang3.0以后我看着好像没这个处理SQL语句的方法了,想用的话前提时引入对应的jar包,以下为它的部分方法:

它的方法,全是静态,直接用类调用即可,下边来根据代码看看它们几个的用法和效果,一看一目了然:

 

[java] view plain copy
 
  1. package stringescapeutils;  
  2.   
  3. import org.apache.commons.lang.StringEscapeUtils;  
  4.   
  5. public class StringEscapeUtilsTest {  
  6.   
  7.     public static void main(String args[]){  
  8.           
  9.         String sql="1' or '1'='1";  
  10.         System.out.println("防SQL注入:"+StringEscapeUtils.escapeSql(sql)); //防SQL注入  
  11.           
  12.         System.out.println("转义HTML,注意汉字:"+StringEscapeUtils.escapeHtml("<font>chen磊  xing</font>"));    //转义HTML,注意汉字  
  13.         System.out.println("反转义HTML:"+StringEscapeUtils.unescapeHtml("<font>chen磊  xing</font>"));  //反转义HTML  
  14.           
  15.         System.out.println("转成Unicode编码:"+StringEscapeUtils.escapeJava("陈磊兴"));     //转义成Unicode编码  
  16.           
  17.         System.out.println("转义XML:"+StringEscapeUtils.escapeXml("<name>陈磊兴</name>"));   //转义xml  
  18.         System.out.println("反转义XML:"+StringEscapeUtils.unescapeXml("<name>陈磊兴</name>"));    //转义xml  
  19.           
  20.     }  
  21. }  

 

 

 

 

输入结果:

 

 

[java] view plain copy
 
  1. 防SQL注入:1'' or ''1''=''1  
  2. 转义HTML,注意汉字:<font>chen磊  xing</font>  
  3. 反转义HTML:<font>chen磊  xing</font>  
  4. 转成Unicode编码:\u9648\u78CA\u5174  
  5. 转义XML:<name>陈磊兴</name>  
  6. 反转义XML:<name>陈磊兴</name>  

 

http://blog.csdn.net/chenleixing/article/details/43456987

http://www.cnblogs.com/thinkpad/p/4837841.html

http://blog.csdn.net/joeyon1985/article/details/43527987

分享到:
评论

相关推荐

    防止XSS攻击解决办法

    防止XSS攻击是保护Web应用安全的重要一环,对于任何Web开发者来说都是必备的知识。 一、XSS攻击类型 XSS攻击主要分为三类:反射型XSS、存储型XSS和DOM型XSS。 1. 反射型XSS:攻击者通过构造恶意链接,诱使用户点击...

    简单模拟XSS攻击.zip

    通过这个项目,你可以学习到如何构建一个基础的Web应用,理解XSS攻击的原理,并学习如何在后端验证和清理用户输入,防止此类攻击的发生。同时,这也是一个很好的实践平台,加深对Node.js、Express以及JavaScript安全...

    java开发常用jar包之dwr.rar

    - **安全性**:CSP机制保护应用免受XSS攻击,同时还有白名单和黑名单机制控制访问权限。 - **调试支持**:内置的调试工具帮助开发者跟踪和调试DWR调用。 - **批量操作**:通过批处理,可以优化网络传输,减少HTTP...

    阿里巴巴Java开发手册(终极版).pdf

    12. **安全性**:了解常见的安全风险,如SQL注入、XSS攻击,使用预编译的PreparedStatement来防止SQL注入,对用户输入进行校验和过滤。 13. **模块化与依赖管理**:理解Maven或Gradle的依赖管理机制,合理组织项目...

    JSP使用过滤器防止Xss漏洞

    本文将详细介绍如何使用过滤器(Filter)在JSP中有效地防止XSS攻击。 首先,我们需要了解XSS攻击的基本原理。当用户在Web表单中输入数据,这些数据未经适当的验证和编码直接显示在页面上时,攻击者可以通过注入恶意...

    Java架构师技术栈.txt

    互联网安全架构-Web常用攻击手段之防盗链&防止CSRF模拟请求............12分布式解决方案-分布式配置中心-SpringBoot客户端整合Apollo分布式配置中心.......14-分布式解决方案-分布式锁解决解决方案-基于Redis方式...

    xss过滤方案

    XSS攻击可以根据不同的标准进行分类,但最常见的分类方式是根据恶意代码存储位置的不同,将其分为以下三种类型: 1. **反射型XSS** - 特征:这类攻击中的恶意代码不会被保存在服务器上,而是通过用户触发(例如...

    基于Java的个人博客软件 PersonalBlog.zip

    - **CSRF与XSS防护**:通过添加令牌防止跨站请求伪造(CSRF)攻击,使用过滤和编码策略防止跨站脚本(XSS)攻击。 5. **权限管理** - **Session与Cookie**:Java中的Session和Cookie用于跟踪用户状态,实现登录...

    后端开发开发技巧总结与入门常用的技巧总结.docx

    安全性:对用户输入进行校验和转义,防止SQL注入、XSS攻击等。采用HTTPS传输数据,对敏感信息加密。 并发控制:理解并合理应用锁机制(如乐观锁、悲观锁),防止并发问题。 缓存策略:在合适的地方引入缓存机制...

    Java综合性校园跑腿系统源码.zip

    10. **安全机制**:为保护用户数据安全,开发者需要考虑防止SQL注入、XSS攻击等,使用HTTPS加密传输,以及密码哈希存储等手段。 11. **测试与调试**:单元测试、集成测试是确保代码质量的重要步骤,JUnit和Mockito...

    2021 Java架构进阶 Nginx企业级教程.txt打包整理.zip

    9. **安全配置**:防止DDoS攻击、XSS、CSRF等安全问题的措施。 【标签解析】 "nginx"对应Nginx服务器的使用和配置;"java"代表Java编程语言和其相关框架;"架构"涵盖了系统架构设计和优化;"运维"可能涉及服务器...

    基于java开发的程序员的情侣网站.zip

    7. **安全机制**:包括用户认证(如JWT)、授权(角色权限管理)以及防止SQL注入和XSS攻击的安全措施。 8. **单元测试和集成测试**:JUnit或TestNG可能用于编写测试用例,确保代码的正确性和稳定性。 9. **版本...

    Java开发手册(嵩山版).pdf.zip

    10. **安全性**:包含了加密解密、权限控制、防止XSS、CSRF等攻击的安全编码原则,确保应用程序的安全性。 11. **性能优化**:提出了代码性能优化的策略,如避免过度设计、减少计算、使用缓存等,以提高程序运行...

    一些非常有用的JAVA常用方法(1).txt

    在处理Web页面数据时,为了防止XSS攻击,通常需要对用户提交的数据进行HTML编码。 ```java public String htmlEncode(String txt) { txt = replace(txt, "&", "&amp;"); txt = replace(txt, "\"", "&quot;"); ...

    java源码:Java论坛系统 JForum.zip

    1. **XSS防护**:防止跨站脚本攻击,对用户输入进行安全过滤。 2. **CSRF防护**:防止跨站请求伪造,确保用户操作的合法性。 3. **SQL注入防御**:使用预编译语句和参数化查询,避免SQL注入漏洞。 4. **密码加密**:...

    Java航班查询与预定系统源码.zip

    Spring Security或Apache Shiro等框架可能被用来处理认证和授权,防止SQL注入、XSS攻击等安全风险。 7. **测试与部署**:单元测试、集成测试是保证代码质量的关键,JUnit和Mockito等工具可以帮助进行测试。部署方面...

    毕设课设-java拍卖系统ssm架构竞拍系统.zip

    此外,还需要注意安全性问题,比如防止SQL注入、XSS攻击等。 通过这个项目,学习者可以实践到如何将Java后端与前端、数据库紧密集成,实现一个完整的Web应用程序,并对SSM框架有深入的理解。同时,这也有助于提升...

    java常用代码方法

    这个`StringUtil`类提供了`trim`方法用于去除字符串两侧的空白字符,`replaceAll`方法用于全局替换字符串中的指定字符,以及`escapeHtml`方法用于转义HTML特殊字符,防止XSS攻击。 总结,Java编程中处理数据验证和...

    Java安全防御学习笔记V1.0.docx

    HTML实体编码是防止跨站脚本(XSS)攻击的有效手段。在Java中,可以使用OWASP Java Encoder Project提供的工具进行正确的HTML编码,以防止恶意脚本在用户浏览器中执行。这个项目提供了一套API,使得开发者能轻松地对...

    java项目之小区门户网站源码.zip

    6. **安全性**:检查项目中是否包含了防止SQL注入、XSS攻击等安全措施,理解如何保护用户数据的安全。 7. **单元测试与集成测试**:查看是否存在JUnit或其他测试框架的代码,理解如何验证和保证代码质量。 通过...

Global site tag (gtag.js) - Google Analytics