基本用法

默认下,使用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问题相关推荐

  1. 使用HTML Purifier解决XSS问题

    在php里解决XSS最简单的方法是使用htmlspecialchars转义xml实体,但对于需要使用xml的时候就搏手无策了.之前一直使用一个叫 RemoveXSS 的函数,该函数过滤得比较严格,很多 ...

  2. java解决XSS攻击常用方法总结

    前言 在项目验收阶段,通常会对待验收项目做一些安全漏洞的测试,比如接口攻击,并发测试,XSS注入,SQL恶意注入测试,安全越权等操作,这时,就是考验项目的安全方面是否做的足够健壮的时候,本篇对XSS脚 ...

  3. 使用HTML Purifier防止xss攻击

    下载地址:http://htmlpurifier.org/download 在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤,XSS就是需要重视的一点,先说一下什么是XSS,简单来说就是 ...

  4. .net解决Xss攻击

    首先要明白什么是Xss攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏 ...

  5. 解决xss/logforging安全漏洞

    注明: 本文为整理记录笔记,不喜勿喷.有问题请留言.CSDN转载必须有原文链接,有些链接找不到了,原文看到了可以留言私我. 漏洞描述: XSS:跨站脚本攻击(Cross Site Script)是一种 ...

  6. js基础笔记学习235解决xss注入攻击

  7. XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决

    XSS(跨站脚本)漏洞详解 XSS的原理和分类 跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆, ...

  8. vue 如何防止xss攻击 框架_LearningNotes-1/Vue/Vue中防止XSS脚本攻击 at master · axuu/LearningNotes-1 · GitHub...

    Vue中防止XSS脚本攻击 最近写了一个博客评论模块,因为引入了表情包,所以就将原来的v-text的形式,改成了v-html,也就是渲染html标签,但是这样不可不免的会带来问题,就是XSS跨站脚本攻 ...

  9. 【安全系列之XSS】XSS攻击测试以及防御

    跨站脚本攻击 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往 ...

最新文章

  1. CentOS虚拟机克隆后网卡配置问题
  2. js下拉 selenium_selenium 难定位元素,时间插件,下拉框定位,string
  3. mysql 商品属性_MySQL产品属性表设计
  4. JS中的内置对象 --- Math、Date、Array、String
  5. swift中变量的几种类型
  6. Informatica_(2)第一个例子
  7. IntelliJ IDEA常用的快捷键积累总结
  8. 现在物价虽然高得离谱,但是内存条都白菜价格了,需要调整程序架构的思维“与时俱进” --- 改进系列之一...
  9. 【HDOJ】1261 字串数【组合数学--排列+代数】
  10. 用51单片机和esp8266实现通过手机app控制单片机小灯
  11. 手机安全修改IMEI的方法
  12. R 语言 optim 使用
  13. Redis Cluster集群搭建
  14. spring-test部分翻译
  15. 微软与三维图形:抑制竞争和创新的案例研究
  16. 动态网站基本上都是有后台的,静态的网站就是纯HTML的网站的,这样的网站是没有后台的
  17. 2021年计算机类 人工智能 软件SCI一区期刊
  18. mysql派生表(Derived Table)简单解析使用的小例子
  19. 微信小程序地图(二) 跑步路线展示
  20. Lake Shore M91快速霍尔测量仪

热门文章

  1. 在前端实现excel导入,在线编辑,导出,打印等功能
  2. 短视频的素材在哪里找呢?推荐给你一个好办法
  3. 如何在App中实现朋友圈功能之三快速实现双向好友功能——箭扣科技Arrownock
  4. nes游戏开发_NES Classic运行Linux,新的0 AD alpha,以及更多游戏新闻
  5. 微信小程序云调用security.mediaCheckAsync接口成功实例(内容安全审核接口)
  6. 微信公众号开发之用户分组
  7. python代理ip多进程_静听网+python爬虫+多线程+多进程+构建IP代理池
  8. S2FGAN论文阅读
  9. 粒子群算法总结+背包问题
  10. 【OpenCV入门】调整图像大小/裁剪图像