注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

wadcl的博客

不是世界太大,是我们的世界太小

 
 
 

日志

 
 

富文本编辑时跨站防护(java)  

2016-04-22 10:11:20|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
富文本编辑时,无法直接对所有的特殊字符进行转义,因为使用富文本编辑的话,本身就需要插入一些标签和属性,所以对于输出到富文本中的用户可控制输入的数据,做富文本安全过滤(允许用户输出HTML的情况):采用白名单的方式限制使用的标签、属性、特定样式:
public static String XSS_filter(String html){
        String xss_html="";
        String[] array_tag={"a","img","p","br","span","h1","h2","h3","ul","h4","h5","h6","table","tr","th","td","li","u",""};
        String[] array_attr={"width","href","src","id","class","height","alt","target","align"};
        String regex="<(/*)(\\w*).*?>";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(html);
        StringBuffer content=new StringBuffer();
        while(matcher.find()){
            System.out.println(matcher.group());
            String temp=matcher.group();
            String reg="";
            String tag=matcher.group(2);
            //查看标签是否在白名单中
            if(check_tag(array_tag,tag)){
//                System.out.println(tag);
                reg="<"+matcher.group(1)+matcher.group(2);
           
            //查看属性是否在白名单中
            String regex_attr="((\\w+)=([\"].*?[\"]|['].*?[']))>?";
            Pattern pattern_attr = Pattern.compile(regex_attr);
            Matcher matcher_attr = pattern_attr.matcher(temp);
            while(matcher_attr.find()){
//                System.out.println(matcher_attr.group(1));
                String attr=matcher_attr.group(2);
                String attr_value=matcher_attr.group(3);
                if(check_attr(array_attr, attr)){
//                    src和href的value值开头不为http或https,则系统给加上
                    if(attr.toLowerCase().equals("href")||attr.toLowerCase().equals("src")){
                        reg=reg+" "+matcher_attr.group(2)+"="+check_url(attr_value);

                    }else{
                    reg=reg+" "+matcher_attr.group(1);
                   
                    }
                    System.out.println(reg);
                }
            }
            reg=reg+">";
            }
            System.out.println("------");
            System.out.println(reg);
            html=html.replace(temp, reg);
            System.out.println();
           
           
           
           
        }
        xss_html=html;
        System.out.println(xss_html);
       
        return xss_html;
    }
   

    public static boolean check_tag(String[] array_tags,String tag){
//        System.out.println(tag);
        for(int i=0;i<array_tags.length;i++){
            if(tag.toLowerCase().equals(array_tags[i])){
                return true;
            }
        }
        return false;
    }
   
    public static boolean check_attr(String[] array_attrs,String attr){
        for(int i=0;i<array_attrs.length;i++){
            if(attr.toLowerCase().equals(array_attrs[i])){
               
                return true;
            }
        }
        return false;
    }
   
    public static String check_url(String attr_value){
        String regex_url="[\"']https?://.+[\"']";
        Pattern pattern_url = Pattern.compile(regex_url);
        Matcher matcher_url = pattern_url.matcher(attr_value);
        if(matcher_url.find()){
            System.out.println(true);
        }else{
            System.out.println(false);
            attr_value="\"http://"+attr_value.replaceAll("\"|'", "")+"\"";
        }
        return attr_value;
    }
  评论这张
 
阅读(97)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017