# HTML Purifier #
>前言:最近因公司项目需要做 HTML 标签过滤,同事推荐了 HTML Purifier 。
>使用过程中虽然因为英文太差(英文文档,网上相关博客比较少)的原因浪费了很多时间,但完成配置设置之后的使用过程还是比较方便的。
>因此在此写下经理的过程以作记录,也说不定能帮助到别人
### HTML Purifier 简介 ###
[HTML Purifier](http://htmlpurifier.org/) 是一个用 PHP 编写的标准、兼容的 HTML 过滤器,支持自定义标签、属性、过滤规则。
可以有效的防止 XSS 攻击!
HTML Purifier 的作者 [Edward Z. Yang](http://ezyang.com/)经历好像蛮丰富的,可以我英文太差,只看明白了几个学校。。。
HTML Purifier 的 package 包在 [Packagist](https://packagist.org) 上有 **680 多万**的下载使用,能看出来有多常用
![img](http://os7eldbpb.bkt.clouddn.com/1.png)
### HTML Purifier 使用 ###
**要求**:HTML Purifier 只需要 PHP 5.2 以及以上版本,并且不需要其他核心组件的支持。
如果是 composer 项目,那么只需要通过 composer 安装和自动加载 [ezyang/htmlpurifier](https://packagist.org/packages/ezyang/htmlpurifier) 就可以使用了,如果项目中没有 composer ,那可以下载standalone版本,并通过require_once引入。
#### 基本使用 ####
```php
require_once(dirname(__FILE__) . '/HTMLPurifier.standalone.php');
$config = HTMLPurifier_Config::createDefault();
$html_purifier = new HTMLPurifier($config);
$clean_html = $html_purifier->purify($dirty_html);
```
说明:引入文件->获取默认配置->实例化->过滤
基础使用不需要任何配置,直接调用 HTML Purifier 就可以过滤
#### 常规配置 ####
HTML Purifier 的使用重点还在于如何进行配置,当需要的时候可以通过 set 方法进行配置
$config->set('config_object', value, a=null);
第一个参数就是需要配置的属性名称,第二个参数就是属性的值。第三个不知道。。。先不管它
配置属性可以通过官网查询 [http://htmlpurifier.org/live/configdoc/plain.html](http://htmlpurifier.org/live/configdoc/plain.html)
HTML Purifier 使用了**白名单过滤**机制,只有被设置允许的才会通过检验。
- 过滤掉文本中的所有html标签
/**
* 过滤掉所有html标签很简单,因为白名单机制
*/
$config->set('HTML.Allowed', '');
- 只允许图片标签 img 及其链接和描述
$config->set('HTML.Allowed', 'img[src|alt]');
#### 自定义标签和属性 ####
HTML Purifier 遵循 HTML 标准,会保留常见的各种HTML标签和合法的HTML定义的标准属性,其他的标签的属性都会被过滤掉!
一般来说就可以满足需求,但总用不够用的时候。这时候就需要来**自定义 HTML Purifier 的标签和属性**了。
我就遇到了这样的问题,一些标签和属性不符合标准或者不被推荐使用了,如果必须要使用,只能自定义才能避免被过滤。
```php
// 默认配置
$config = HTMLPurifier_Config::createDefault();
//设置配置的名称
$config->set('HTML.DefinitionID', 'smzdm library version');
//设置配置的版本
$config->set('HTML.DefinitionRev', 1);
// 清理配置缓存,上线时关掉这句
$config->set('Cache.DefinitionImpl', null);
$def = $config->getHTMLDefinition(true);
// 允许 audio 标签
$def->addElement(
'audio',
'Block',
'Flow',
'Common',
[
'data-id' => 'Number'
]
);
// 为 img 标签添加 data-weight 属性
$def->addAttribute(
'img',
'data-weight',
'Number'
);
$this->html_purifier = new HTMLPurifier($config);
```
这里多了3个set操作,配置的**名称和版本**会作为配置的缓存key,最终这份配置会被缓存到磁盘到一个文件里。但是如果先执行过一次生成了缓存,而后再次执行时修改了配置,这个缓存是不会更新的,因此上面的第三个set就是清理缓存的用途,上线时就不要保留了,只是在调试htmlpurifier 时保障每次配置都可以得到更新而已。
下面的两个地方分别定义了一个 audio 标签和 为 img 标签添加的新属性
如果有比较多的配置、标签、属性需要进行设置的也可以自己封装一个方法来设置。
更多的配置请参考[官方文档](http://htmlpurifier.org/docs/enduser-customize.html)
>参考链接:
>[HTMLPurifier使用教程](http://blog.csdn.net/hanzengyi/article/details/43019479)
>[为htmlpurifier订制xss过滤](https://yuerblog.cc/2017/05/10/htmlpurifier-xss-config/?utm_source=tuicool&utm_medium=referral)