使用HTML Purifier解决XSS问题

来源:互联网 发布:java webapi 编辑:程序博客网 时间:2024/05/10 17:12
在php里解决XSS最简单的方法是使用htmlspecialchars转义xml实体,但对于需要使用xml的时候就搏手无策了。之前一直使用一个叫RemoveXSS的函数,该函数过滤得比较严格,很多html特性都过滤了,而且有bug,不修改代码使用起来很不友好,修改了却无法应对灵活的XSS攻击。 

HTML Purifier是基于php 5所编写的HTML过滤器,支持自定义过滤规则,还可以把不标准的HTML转换为标准的HTML,是WYSIWYG编辑器的福音。。 

一、使用HTML Purifier的要求 
  • php 5+
  • iconv
  • bcmath
  • tidy
二、基本用法 
默认下,使用UTF-8编码,和XHTML 1.0 Transitional文档类型. 
Php代码  收藏代码
  1. <?php  
  2. require_once 'library/HTMLPurifier.includes.php';  
  3.   
  4. $dirty_html = <<<EOF  
  5. <h1>Hello  
  6. <script>alert("world");</script>  
  7. EOF;  
  8.   
  9. $purifier = new HTMLPurifier();  
  10.   
  11. $cleanHtml = $purifier->purify($dirty_html);  

输出: 
Html代码  收藏代码
  1. <h1>Hello  
  2. </h1>  

  • 过滤了XSS代码,过滤规则:http://htmlpurifier.org/live/smoketests/xssAttacks.php
  • 自动填充了残缺的标签
三、使用配置 
配置主要用于设置规则,使用比较简单 
Php代码  收藏代码
  1. $config = HTMLPurifier_Config::createDefault();  
  2. // something....  
  3. $purifier = new HTMLPurifier($config);  

详细的配置规则:http://htmlpurifier.org/live/configdoc/plain.html 

四、属性相关规则 
1.id规则 
默认下,HTML Purifier是不允许使用id的,可以通过Attr.EnableID选项来控制,当允许使用id的时候,有点需要注意,id只允许全局一个,后面重复的都会被去掉。 
Php代码  收藏代码
  1. $config->set('Attr.EnableID', true); // 允许使用id  
  2. $config->set('Attr.IDPrefix''test_'); // 给所有id加上前缀test_  
  3. $config->set('Attr.IDBlacklist'array// 设置黑名单,会过滤掉设置的id,如果设置了id前缀,要把前缀也加上  
  4.     'test_black_list'  
  5. ));  
  6. $config->set('Attr.IDBlacklistRegexp''/list_\d+/'); // 黑名单,使用正则匹配  

输入:
Java代码  收藏代码
  1. <a id="test_by_willko" href="aa">adf</a>  
  2. <a id="black_list" href="aa">adf</a>  
  3. <a id="black_list_2" href="aa">adf</a>  

输出:
Java代码  收藏代码
  1. <a id="test_by_willko" href="aa">adf</a>  
  2. <a href="aa">adf</a>  
  3. <a href="aa">adf</a>  

2.class规则 
默认下,是允许所有的class。属性Attr.AllowedClasses用于设置允许的class名,没被设置的class将被拒绝使用。而Attr.ForbiddenClasses则用于设置拒绝使用的class名。 
Php代码  收藏代码
  1. $config->set('Attr.AllowedClasses'array// 设置允许使用的class名  
  2.     'test_by_willko'  
  3. ));  
  4. $config->set('Attr.ForbiddenClasses'array// 设置拒绝使用的class名  
  5.     'ignore'  
  6. ));  

输入:
Java代码  收藏代码
  1. <p class="test_by_willko">12345</p>  
  2. <p class="ignore">78900</p>  

输出:
Java代码  收藏代码
  1. <p class="test_by_willko">12345</p>  
  2. <p>78900</p>  


参考资料: 
http://htmlpurifier.org/live/INSTALL 

http://htmlpurifier.org/docs


原文:http://willko.iteye.com/blog/475493

0 0
原创粉丝点击