为htmlpurifier订制xss过滤

栏目: 编程工具 · 发布时间: 6年前

内容简介:为htmlpurifier订制xss过滤

xss简介

我们每天读的公众号文章,其内容是小编通过富文本编辑器生成的。内容发布者在富文本编辑器里可视化的编写文字与图片并进行简单的排版,背后其实是编辑器动态的生成各种html标签,最终文章对应的完整html会被提交到服务端保存。当读者打开文章时,服务端将保存的html直接返回给浏览器进行渲染。

读者直接获取并展现小编提交的html,这是极其危险的,万一html里有一段<script>包裹的Js代码,那读者的信息就可以被小编通过Js代码盗走,这种攻击手段叫做xss。当然,像<script>这种xss手法是很好防御的,只需要检查小编提交的html过滤掉<script>标签即可,但是xss远没有这么简单。恶意的小编会利用错乱的<、>、引号等导致最终读者的页面出现意想不到的标签闭合效果,或者利用onclick,onerror等标签的事件函数来实现js代码的执行,等等诸如此类的注入手法。

那么xss过滤就是用来检查小编提交的html,将存在安全隐患的代码移除掉,将不规范的代码整理或移除,最终留下一个安全可靠的html,安全到可以直接展现给读者。

htmlpurifier基础使用

既然xss的注入手段各式各样,光是事件函数的类型都数不过来,因此不如找一个历史积累丰富的xss过滤开源库,那就是著名的 htmlpurifier 了,像有名的Yii2框架也是内置了这个库。

如果你是composer项目,可以通过composer安装与自动加载。如果是比较老的项目,可以下载standalone版本,并通过require_once引入。

基础用法不需要任何配置,直接将小编提交的html传给htmlpurifier即可完成过滤:

$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);

htmlpurifier添加标签和属性

这个库遵循HTML标准,会保留常见的各种HTML标签,而删除库中未定义的标签。对于标签属性也是如此,只会保留合法的HTML定义的标准属性。通常来说,你不必对它做什么订制就可以正常工作了,但是也不排除特殊需求。

一些情况下,你会希望保留某些自定义属性,或者保留某些自定义的标签,这时候必须订制htmlpurifier。订制并不是很复杂,可以参考 官方文档 来学习如何订制标签和属性,网上鲜有博客说明这一块的具体做法。

我遇到的情况是,公司的某个富文本中包含<dir>标签被htmlpurifier删除了,我查了一下HTML标准获知,这个标签是符合标准的,但是不推荐使用了。没办法,我必须订制它,避免htmlpurifier将其过滤:

        // 默认配置
        $config = HTMLPurifier_Config::createDefault();
        // 自定义配置 http://htmlpurifier.org/docs/enduser-customize.html
        $config->set('HTML.DefinitionID', 'smzdm library version');
        $config->set('HTML.DefinitionRev', 1);
        $config->set('Cache.DefinitionImpl', null); // 清理配置缓存,上线时关掉这句
        $def = $config->getHTMLDefinition(true);
        // 允许卡片的<dir>标签
        $def->addElement(
            'dir',
            'Block',
            'Flow',
            'Common',
            [
                'res-data-id' => 'Number'
            ]
        );
 
        $this->html_purifier = new HTMLPurifier($config);

这里多了3个set操作,第一个是设置这个配置的名称,第二个是配置的版本,它俩会作为配置的缓存key,最终这份配置会被缓存到磁盘到一个文件里。但是如果先执行过一次生成了缓存,而后再次执行时修改了配置,这个缓存是不会更新的,因此上面的第三个set就是清理缓存的用途,上线时就不要保留了,只是在调试htmlpurifier时保障每次配置都可以得到更新而已。

下面,我订制了一个<dir>标签。

它是一个块级元素(Block),我们知道合理的HTML规范是块级元素内可以有块级元素与内联元素,而内联元素内只能有内联元素。

Flow指定了<dir>允许孩子是块级元素或者内联元素,这和HTML规范一致。

Common指定了<dir>可以包含一些常见的属性: id , style , class , title and lang..

最后一个参数是为<dir>添加了自定义属性,这样res-data-id属性就不会被htmlpurifier过滤掉了,它的合法值是一个整形,否则将被过滤掉。

本文抛砖引玉,如果有疑惑就认真读一下官方文档,多测试多尝试。


以上所述就是小编给大家介绍的《为htmlpurifier订制xss过滤》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

统计思维:程序员数学之概率统计

统计思维:程序员数学之概率统计

Allen B.Downey / 张建锋、陈钢 / 人民邮电出版社 / 2013-5 / 29.00元

代码跑出来的概率统计问题; 程序员的概率统计开心辞典; 开放数据集,全代码攻略。 现实工作中,人们常被要求用数据说话。可是,数据自己是不能说话的,只有对它进行可靠分析和深入挖掘才能找到有价值的信息。概率统计是数据分析的通用语言,是大数据时代预测未来的根基。 站在时代浪尖上的程序员只有具备统计思维才能掌握数据分析的必杀技。本书正是一本概率统计方面的入门图书,但视角极为独特,折......一起来看看 《统计思维:程序员数学之概率统计》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试