首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTMLPurifier库删除所有自定义标记

HTMLPurifier库删除所有自定义标记
EN

Stack Overflow用户
提问于 2017-06-15 05:35:24
回答 1查看 931关注 0票数 1

我使用的是4.0.0版本的html纯净器库,并且我的所有请求都被这个库净化了。有时,我们需要允许一些不属于标准定义的任意定制标记和xml标记。在这里,库将删除所有不受支持的库。

我知道我们可以编写定义以支持自定义属性和标记,但我的问题是支持任何自定义标记,而不允许只允许脚本、iframe等少数标记。

在图书馆里有办法做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-16 07:24:50

简短回答

不是的。

长答案

一般来说,HTML净化器的原理是白名单。这意味着它必须知道所有的合法星座,并将放弃任何它不承认的东西。

即使您使用HTML.ForbiddenElements将HTML纯净器放入黑名单模式,这也是一个次要的设计特性。HTML净化器仍然坚持,它知道所有的元素和属性,它得到的,并将删除任何其他。

为什么要限制?

为什么不使用基本黑名单方法的一个生动的例子是查看HTML5中添加到HTML规范中的大量元素和属性。

考虑一下HTML5安全测试表。如果您在浏览器支持HTML5之前实现了黑名单方法,您可能还没有意识到:

你看到问题了。这就是为什么HTML净化器不允许您信任任意的自定义标记。

做什么?

我建议教HTML净化器所有的定制标签和属性。如果它们不是完全武断的,这种方法确实会有所帮助。我不得不将许多定制的Outlook标记和属性编码到一个项目的HTML净化器中--虽然开发很繁琐,但净收益(健壮的安全性)是值得的。

如果您确实决定创建该路径,请查看"终端用户:自定义“文档。

页面上的示例尝试实现<form>,而HTML纯净器本机不支持它。从usecase的角度来看,它在技术上不是一个自定义元素,但它很好地说明了这个过程:

多汁!只有这样,我们才能回答我们五个问题中的四个:

  1. 元素的名称是什么?form
  2. 这个元素属于什么内容集?(这需要一些调查,我发现最简单的方法是搜索DTD以寻找表单并确定它在哪个集合中)。
  3. 允许该元素的子元素是什么?一个或多个流元素,但没有嵌套的窗体
  4. 元素允许哪些属性是通用的?公共
  5. 元素允许哪些属性是特定于这个元素的呢?一个整体,参见ATTLIST;我们将执行重要的属性:action**,** method name

是时候编写一些代码了:

$config = HTMLPurifier_Config::createDefault();$config->set('HTML.DefinitionID','enduser-customize.html教程‘);$config->set('HTML.DefinitionRev',1);$config->set(’Cache.DefiniImpl‘,null);//稍后删除这一点!$def =$config->getHTMLDefinition(真);$def->addAttribute( 'a',’目标‘,新HTMLPurifier_AttrDef_Enum(数组(’_$def‘,'_self',’__top‘));$form =$def->加法元素(“表单”、//名称“块”、//内容集“流”、//允许子级“公共”、//属性集合数组( // attribute 'action*‘=> 'URI’、方法‘=>’Enum#get\post‘、' name’=> 'ID‘);$form->排除数组( 'form’=> true);

每个参数对应于我们提出的问题之一。注意,我们在action属性的末尾添加了一个星号,以指示它是必需的。如果有人指定没有该属性的表单,则标记将被删除。此外,末尾的额外行是一个特殊的额外声明,它防止表单相互嵌套。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44559312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档