使用HTML Purifier解决XSS问题

本文介绍了一款基于PHP5的HTML过滤器HTMLPurifier,它不仅能够有效防止XSS攻击,还能修正不规范的HTML代码。文章详细阐述了如何安装配置及使用此工具,并提供了具体的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在php里解决XSS最简单的方法是使用htmlspecialchars转义xml实体,但对于需要使用xml的时候就搏手无策了。之前一直使用一个叫[url=http://kallahar.com/smallprojects/php_xss_filter_function.php]RemoveXSS[/url]的函数,该函数过滤得比较严格,很多html特性都过滤了,而且有bug,不修改代码使用起来很不友好,修改了却无法应对灵活的XSS攻击。

[url=http://htmlpurifier.org/]HTML Purifier[/url]是基于php 5所编写的HTML过滤器,支持自定义过滤规则,还可以把不标准的HTML转换为标准的HTML,是WYSIWYG编辑器的福音。。

[size=medium][b]一、使用HTML Purifier的要求[/b][/size]
[list]
[*]php 5+
[*]iconv
[*]bcmath
[*]tidy
[/list][size=medium][b]二、基本用法[/b][/size]
默认下,使用UTF-8编码,和XHTML 1.0 Transitional文档类型.
<?php
require_once 'library/HTMLPurifier.includes.php';

$dirty_html = <<<EOF
<h1>Hello
<script>alert("world");</script>
EOF;

$purifier = new HTMLPurifier();

$cleanHtml = $purifier->purify($dirty_html);

输出:
<h1>Hello
</h1>

[list]
[*]过滤了XSS代码,过滤规则:[url]http://htmlpurifier.org/live/smoketests/xssAttacks.php[/url]
[*]自动填充了残缺的标签
[/list][size=medium][b]三、使用配置[/b][/size]
配置主要用于设置规则,使用比较简单
$config = HTMLPurifier_Config::createDefault();
// something....
$purifier = new HTMLPurifier($config);

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

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

输入:
<a id="test_by_willko" href="aa">adf</a>
<a id="black_list" href="aa">adf</a>
<a id="black_list_2" href="aa">adf</a>

输出:
<a id="test_by_willko" href="aa">adf</a>
<a href="aa">adf</a>
<a href="aa">adf</a>

[b]2.class规则[/b]
默认下,是允许所有的class。属性Attr.AllowedClasses用于设置允许的class名,没被设置的class将被拒绝使用。而Attr.ForbiddenClasses则用于设置拒绝使用的class名。
$config->set('Attr.AllowedClasses', array( // 设置允许使用的class名
'test_by_willko'
));
$config->set('Attr.ForbiddenClasses', array( // 设置拒绝使用的class名
'ignore'
));

输入:
<p class="test_by_willko">12345</p>
<p class="ignore">78900</p>

输出:
<p class="test_by_willko">12345</p>
<p>78900</p>


[size=medium][b]四、HTML相关规则[/b][/size]
最近,身体不适,待续...

参考资料:
[url]http://htmlpurifier.org/live/INSTALL[/url]
[url]http://htmlpurifier.org/docs[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值