HTML Purifier --非常好用的XSS过滤器

# 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值