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)
HTML Purifier --非常好用的XSS过滤器相关推荐
- xss绕过字符过滤_IE8 xss filter bypass (xss过滤器绕过)
简要描述: IE 8 XSS 过滤器绕过.感谢@Sogili牛为本绕过通用性实现上提供的tricks. 详细说明: 1. 在IE8中,可以通过 <?import> + 的方式来构成一个XS ...
- html使用js的变量_JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器
什么是JavaScript全局变量? JavaScript全局变量在函数外部声明或使用window对象声明,它可以通过任何函数访问. 假设你的目标Web应用程序容易受到映射到JavaScript字符串 ...
- JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器
什么是JavaScript全局变量? JavaScript全局变量在函数外部声明或使用window对象声明,它可以通过任何函数访问. 假设你的目标Web应用程序容易受到映射到JavaScript字符串 ...
- xss过滤器无法处理ajax请求_thunkPHP 预防XSS攻击
比如在有人恶意在你的输入框中或文本域中输入<script>标签,如果不做处理的话,输入框中的<script>会保存到我们数据库中,等到将这个数据拿出来展示的时候,就等于将这个内 ...
- WAF指纹识别和XSS过滤器绕过技巧
2019独角兽企业重金招聘Python工程师标准>>> http://www.it165.net/safe/html/201402/832.html 转载于:https://my.o ...
- xss绕过字符过滤_XSS过滤器绕过总结
XSS过滤器绕过总结 黑名单过滤器绕过 黑名单模式下的过滤器是最常见的.他们的目标是检测特定模式并防止恶意行为.这完全是"模式"的问题,它们越准确,就越可以拦截攻击. 1. 注入脚 ...
- 反射型xss解决方法,增加过滤器,防止反射型 XSS攻击漏洞
web.xml配置 <filter><filter-name>XSSFilter</filter-name><filter-class>com.xxx. ...
- 防止XSS跨站脚本攻击:Java过滤器
XSS问题描述 跨站脚本(Cross site script,简称xss)是一种"HTML注入",由于攻击的脚本多数时候是跨域的,所以称之为"跨域脚本". 我们 ...
- 跨站点脚本(XSS)
1. 简介 跨站点脚本(XSS)是当前web应用中最危险和最普遍的漏洞之一.安全研究人员在大部分最受欢迎的网站,包括Google, Facebook, Amazon, PayPal等网站都发现这个漏洞 ...
最新文章
- 006 Spark中的wordcount以及TopK的程序编写
- [JavaWebService-axis]-环境搭建
- Swift2.0语言教程之函数嵌套调用形式
- 442. Find All Duplicates in an Array
- Python持续更新的新特性
- python大作业爬虫_Python大作业---微博爬虫及简单数据分析
- OSSemPend()--等待一个信号量
- Linux学习笔记---移植官方linux步骤(一)
- 四大组件之BroadcastReceiver
- ArchLinux借助Winetricks-zh安裝WineQQ8.1
- 快应用开发教程【02】--项目配置教程
- 理解 Objective-c 属性
- CSS中如何实现表格文字的换行
- java闹钟_JAVA 闹钟程序
- 如何储存图片方法jpg格式png格式#ps教程#ps抠图
- HCE-OS基础介绍
- 我看到了一个真实的日本
- App怎么推广最有效
- 分布式+ARM:云和恩墨zData与华为TaiShan服务器完成兼容性认证测试
- 购物栏置底 - uni-ui组件uni-goods-nav放在屏幕下方的办法