为htmlpurifier订制xss过滤

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

内容简介:为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过滤》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

人月神话

人月神话

[美] 弗雷德里克·布鲁克斯 / 汪颖 / 清华大学出版社 / 2002-11 / 29.80元

作者为人们管理复杂项目提供了颇具洞察力的见解,既有很多发人深省的观点,也有大量的软件工程实践。书中的内容来自布鲁克斯在IBM公司System 360家族和OS 360中的项目管理经验。初版的20年后,布鲁克斯重新审视了他原先的观点,增加了一些新的想法和建议。新增加的章节包括:原著中一些核心观点的精华;在经过了一个时代以后,Brooks博士对原先观点新的认识;1986年的经典文章《没有银弹》;对19......一起来看看 《人月神话》 这本书的介绍吧!

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

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

SHA 加密
SHA 加密

SHA 加密工具