我使用的是4.0.0版本的html纯净器库,并且我的所有请求都被这个库净化了。有时,我们需要允许一些不属于标准定义的任意定制标记和xml标记。在这里,库将删除所有不受支持的库。
我知道我们可以编写定义以支持自定义属性和标记,但我的问题是支持任何自定义标记,而不允许只允许脚本、iframe等少数标记。
在图书馆里有办法做到这一点吗?
发布于 2017-06-16 07:24:50
简短回答
不是的。
长答案
一般来说,HTML净化器的原理是白名单。这意味着它必须知道所有的合法星座,并将放弃任何它不承认的东西。
即使您使用HTML.ForbiddenElements将HTML纯净器放入黑名单模式,这也是一个次要的设计特性。HTML净化器仍然坚持,它知道所有的元素和属性,它得到的,并将删除任何其他。
为什么要限制?
为什么不使用基本黑名单方法的一个生动的例子是查看HTML5中添加到HTML规范中的大量元素和属性。
考虑一下HTML5安全测试表。如果您在浏览器支持HTML5之前实现了黑名单方法,您可能还没有意识到:
你看到问题了。这就是为什么HTML净化器不允许您信任任意的自定义标记。
做什么?
我建议教HTML净化器所有的定制标签和属性。如果它们不是完全武断的,这种方法确实会有所帮助。我不得不将许多定制的Outlook标记和属性编码到一个项目的HTML净化器中--虽然开发很繁琐,但净收益(健壮的安全性)是值得的。
如果您确实决定创建该路径,请查看"终端用户:自定义“文档。
页面上的示例尝试实现<form>,而HTML纯净器本机不支持它。从usecase的角度来看,它在技术上不是一个自定义元素,但它很好地说明了这个过程:
多汁!只有这样,我们才能回答我们五个问题中的四个:
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属性的末尾添加了一个星号,以指示它是必需的。如果有人指定没有该属性的表单,则标记将被删除。此外,末尾的额外行是一个特殊的额外声明,它防止表单相互嵌套。
https://stackoverflow.com/questions/44559312
复制相似问题