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

HTML Purifier --非常好用的XSS过滤器相关推荐

  1. xss绕过字符过滤_IE8 xss filter bypass (xss过滤器绕过)

    简要描述: IE 8 XSS 过滤器绕过.感谢@Sogili牛为本绕过通用性实现上提供的tricks. 详细说明: 1. 在IE8中,可以通过 <?import> + 的方式来构成一个XS ...

  2. html使用js的变量_JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器

    什么是JavaScript全局变量? JavaScript全局变量在函数外部声明或使用window对象声明,它可以通过任何函数访问. 假设你的目标Web应用程序容易受到映射到JavaScript字符串 ...

  3. JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器

    什么是JavaScript全局变量? JavaScript全局变量在函数外部声明或使用window对象声明,它可以通过任何函数访问. 假设你的目标Web应用程序容易受到映射到JavaScript字符串 ...

  4. xss过滤器无法处理ajax请求_thunkPHP 预防XSS攻击

    比如在有人恶意在你的输入框中或文本域中输入<script>标签,如果不做处理的话,输入框中的<script>会保存到我们数据库中,等到将这个数据拿出来展示的时候,就等于将这个内 ...

  5. WAF指纹识别和XSS过滤器绕过技巧

    2019独角兽企业重金招聘Python工程师标准>>> http://www.it165.net/safe/html/201402/832.html 转载于:https://my.o ...

  6. xss绕过字符过滤_XSS过滤器绕过总结

    XSS过滤器绕过总结 黑名单过滤器绕过 黑名单模式下的过滤器是最常见的.他们的目标是检测特定模式并防止恶意行为.这完全是"模式"的问题,它们越准确,就越可以拦截攻击. 1. 注入脚 ...

  7. 反射型xss解决方法,增加过滤器,防止反射型 XSS攻击漏洞

    web.xml配置 <filter><filter-name>XSSFilter</filter-name><filter-class>com.xxx. ...

  8. 防止XSS跨站脚本攻击:Java过滤器

    XSS问题描述 跨站脚本(Cross site script,简称xss)是一种"HTML注入",由于攻击的脚本多数时候是跨域的,所以称之为"跨域脚本". 我们 ...

  9. 跨站点脚本(XSS)

    1. 简介 跨站点脚本(XSS)是当前web应用中最危险和最普遍的漏洞之一.安全研究人员在大部分最受欢迎的网站,包括Google, Facebook, Amazon, PayPal等网站都发现这个漏洞 ...

最新文章

  1. 006 Spark中的wordcount以及TopK的程序编写
  2. [JavaWebService-axis]-环境搭建
  3. Swift2.0语言教程之函数嵌套调用形式
  4. 442. Find All Duplicates in an Array
  5. Python持续更新的新特性
  6. python大作业爬虫_Python大作业---微博爬虫及简单数据分析
  7. OSSemPend()--等待一个信号量
  8. Linux学习笔记---移植官方linux步骤(一)
  9. 四大组件之BroadcastReceiver
  10. ArchLinux借助Winetricks-zh安裝WineQQ8.1
  11. 快应用开发教程【02】--项目配置教程
  12. 理解 Objective-c 属性
  13. CSS中如何实现表格文字的换行
  14. java闹钟_JAVA 闹钟程序
  15. 如何储存图片方法jpg格式png格式#ps教程#ps抠图
  16. HCE-OS基础介绍
  17. 我看到了一个真实的日本
  18. App怎么推广最有效
  19. 分布式+ARM:云和恩墨zData与华为TaiShan服务器完成兼容性认证测试
  20. 购物栏置底 - uni-ui组件uni-goods-nav放在屏幕下方的办法

热门文章

  1. Java 在线编辑 Excel
  2. 【miscellaneous】视频浓缩摘要简介
  3. 减一技术实现求a的n次幂
  4. HTML+CSS一篇文章搞定
  5. 悬赏任务小程序搭建抖音点赞app任务发布接单平台任务分销公众号开发
  6. java date 构造方法_Java Date的概述和构造方法
  7. 企业级BOM系统与外部系统集成的几种方案
  8. spring(一)依赖注入与 SPEL
  9. YOLOv5实现吸烟行为检测
  10. 鸿蒙系统学习笔记(一) 鸿蒙系统介绍