HTML Purifier解决XSS问题
基本用法
默认下,使用UTF-8编码,和XHTML 1.0 Transitional文档类型.
require_once '/path/to/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
使用配置
详细的配置规则:http://htmlpurifier.org/live/configdoc/plain.html
$config->set('HTML.AllowedElements', array('div'=>true, 'table'=>true, 'tr'=>true, 'td'=>true, 'br'=>true));
$config->set('HTML.Doctype', 'XHTML 1.0 Transitional') //html文档类型(常设)
$config->set('Core.Encoding', 'UTF-8') //字符编码(常设)
HTML允许的元素:div元素,table元素,tr元素,td元素,br元素
1、配置属性选择
HTMLPurifier的配置文档主要是两级分类,大类分Attr(属性)、HTML(html标签)、AutoFormat(自动格式)、CSS(css配置)、Output(输出配置)……小类选择通过大类名称加.加小类名称可以完成。
比如我要配置允许的html标签,比如说p标签和a标签,可以如下配置
$config->set('HTML.Allowed', 'p,a');
2、属性值的选择
在官方文档中,点击一个属性后,可以看到对这个属性的解释,会告诉你这个属性的值的类型(Type)是String、Int、Array、Boolen……
接着还会告诉你这个属性的默认值,比如是NULL还是true还是false等。这个值的格式就跟PHP的格式一样的。
3、白名单过滤机制
HTMLPurifier使用了白名单过滤机制,只有被设置允许的才会通过检验。
4、基本过滤事例
a、过滤掉文本中的所有html标签
/*** 过滤掉所有html标签很简单,原因则在白名单机制完成*/
$config->set('HTML.Allowed', '');
b、保留超链接标签a及其href链接地址属性,并自动添加target属性值为’_blank’
$config->set('HTML.Allowed', 'a[href]');
$config->set('HTML.TargetBlank', true);
/*** 只允许图片标签 img 及其链接和描述*/
$config->set('HTML.Allowed', 'img[src|alt]');
c、自动完成段落代码并清除掉无用的空标签
// 让文本自动添加段落标签,前提是必须允许P标签的使用
$config->set('HTML.Allowed', 'p');
$config->set('AutoFormat.AutoParagraph', true);
// 清除空标签
$config->set('AutoFormat.RemoveEmpty', true);
当然了,HTMLPurifier的过滤功能非常强大的,每一个点都要写到那也不现实,这里主要还是要说明如何写配置,只有配置好了才知道如何去拓展!
实例
1.id规则
默认下,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>
2.class规则
默认下,是允许所有的class。属性Attr.AllowedClasses用于设置允许的class名,没被设置的class将被拒绝使用。而Attr.ForbiddenClasses则用于设置拒绝使用的class名。
$config->set('Attr.AllowedClasses', array( // 设置允许使用的class名 'test_by_willko' )); $config->set('Attr.ForbiddenClasses', array( // 设置拒绝使用的class名 'ignore' ));
#### 自定义标签和属性 ####
// 默认配置$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.php
<?php require_once 'HTMLPurifier.includes.php'; require_once 'HTMLPurifier.autoload.php'; class Resume_HtmlPurifier implements Zend_Filter_Interface{ protected $_htmlPurifier = null; public function __construct($options = null) { $config = HTMLPurifier_Config::createDefault(); $config->set('Code.Encoding', 'UTF-8'); $config->set('HTML.Doctype', 'XHTML 1.0 Transitional') if(!is_null($options)){ foreach($options as $option){ $config->set($option[0], $option[1], $option[2]); } } $this->_htmlPurifier = new HTMLPurifier($config); } public function filter($value) { return $this->_htmlPurifier->purify($value); } } ?>
设置config信息
例如:
$conf = array( array('HTML.AllowedElements', array( 'div' => true, 'table' => true, 'tr' => true, 'td' => true, 'br' => true, ), false), //允许属性 div table tr td br元素 array('HTML.AllowedAttributes', array('class' => TRUE), false), //允许属性 class array('Attr.ForbiddenClasses', array('resume_p' => TRUE), false), //禁止classes如 array('AutoFormat.RemoveEmpty', true, false), //去空格 array('AutoFormat.RemoveEmpty.RemoveNbsp', true, false), //去nbsp array('URI.Disable', true, false), );
调用
$p = new Resume_HtmlPurifier($conf); $puri_html = $p->filter($html);
参考资料:
http://blog.csdn.net/hanzengyi/article/details/43019479
http://willko.iteye.com/blog/475493
http://blog.csdn.net/motian06/article/details/8064811
http://blog.csdn.net/u010128133/article/details/73823367
转载于:https://my.oschina.net/u/1269381/blog/1536752
HTML Purifier解决XSS问题相关推荐
- 使用HTML Purifier解决XSS问题
在php里解决XSS最简单的方法是使用htmlspecialchars转义xml实体,但对于需要使用xml的时候就搏手无策了.之前一直使用一个叫 RemoveXSS 的函数,该函数过滤得比较严格,很多 ...
- java解决XSS攻击常用方法总结
前言 在项目验收阶段,通常会对待验收项目做一些安全漏洞的测试,比如接口攻击,并发测试,XSS注入,SQL恶意注入测试,安全越权等操作,这时,就是考验项目的安全方面是否做的足够健壮的时候,本篇对XSS脚 ...
- 使用HTML Purifier防止xss攻击
下载地址:http://htmlpurifier.org/download 在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤,XSS就是需要重视的一点,先说一下什么是XSS,简单来说就是 ...
- .net解决Xss攻击
首先要明白什么是Xss攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏 ...
- 解决xss/logforging安全漏洞
注明: 本文为整理记录笔记,不喜勿喷.有问题请留言.CSDN转载必须有原文链接,有些链接找不到了,原文看到了可以留言私我. 漏洞描述: XSS:跨站脚本攻击(Cross Site Script)是一种 ...
- js基础笔记学习235解决xss注入攻击
- XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决
XSS(跨站脚本)漏洞详解 XSS的原理和分类 跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆, ...
- vue 如何防止xss攻击 框架_LearningNotes-1/Vue/Vue中防止XSS脚本攻击 at master · axuu/LearningNotes-1 · GitHub...
Vue中防止XSS脚本攻击 最近写了一个博客评论模块,因为引入了表情包,所以就将原来的v-text的形式,改成了v-html,也就是渲染html标签,但是这样不可不免的会带来问题,就是XSS跨站脚本攻 ...
- 【安全系列之XSS】XSS攻击测试以及防御
跨站脚本攻击 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往 ...
最新文章
- CentOS虚拟机克隆后网卡配置问题
- js下拉 selenium_selenium 难定位元素,时间插件,下拉框定位,string
- mysql 商品属性_MySQL产品属性表设计
- JS中的内置对象 --- Math、Date、Array、String
- swift中变量的几种类型
- Informatica_(2)第一个例子
- IntelliJ IDEA常用的快捷键积累总结
- 现在物价虽然高得离谱,但是内存条都白菜价格了,需要调整程序架构的思维“与时俱进” --- 改进系列之一...
- 【HDOJ】1261 字串数【组合数学--排列+代数】
- 用51单片机和esp8266实现通过手机app控制单片机小灯
- 手机安全修改IMEI的方法
- R 语言 optim 使用
- Redis Cluster集群搭建
- spring-test部分翻译
- 微软与三维图形:抑制竞争和创新的案例研究
- 动态网站基本上都是有后台的,静态的网站就是纯HTML的网站的,这样的网站是没有后台的
- 2021年计算机类 人工智能 软件SCI一区期刊
- mysql派生表(Derived Table)简单解析使用的小例子
- 微信小程序地图(二) 跑步路线展示
- Lake Shore M91快速霍尔测量仪
热门文章
- 在前端实现excel导入,在线编辑,导出,打印等功能
- 短视频的素材在哪里找呢?推荐给你一个好办法
- 如何在App中实现朋友圈功能之三快速实现双向好友功能——箭扣科技Arrownock
- nes游戏开发_NES Classic运行Linux,新的0 AD alpha,以及更多游戏新闻
- 微信小程序云调用security.mediaCheckAsync接口成功实例(内容安全审核接口)
- 微信公众号开发之用户分组
- python代理ip多进程_静听网+python爬虫+多线程+多进程+构建IP代理池
- S2FGAN论文阅读
- 粒子群算法总结+背包问题
- 【OpenCV入门】调整图像大小/裁剪图像