使用HTML Purifier解决XSS问题
博客分类:
• php
HTMLPHPXMLXHTML
在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+/'); // 黑名单,使用正则匹配
|
|