我正在使用4.0.0版本的htmlpurifier库,我的所有请求都被库清理。有时我们需要允许一些不属于标准定义的任意自定义标签和xml标签。这里库删除了所有不受支持的库。
我知道我们可以编写定义来支持自定义属性和标记,但我的问题是支持任何自定义标记,而不允许只有少数标记,如脚本,iframe等。
有没有办法在图书馆实现这一目标?
答案 0 :(得分:1)
没有
一般来说,HTML Purifier的原则是白名单。这意味着它必须知道所有合法的星座,并且会丢弃它不承认的任何东西。
即使您使用HTML.ForbiddenElements将HTML Purifier置于黑名单模式,这也是辅助设计功能。 HTML Purifier仍然坚持知道它所提供的所有元素和属性,并将删除其他任何内容。
为什么不使用基本的黑名单方法的一个生动的例子是看看HTML5中添加到HTML规范中的大量元素和属性。
考虑HTML5 Security Cheatsheet。如果您在浏览器支持HTML5之前实施了黑名单方法,那么您可能没有意识到:
<video>
would have been a good tag to blacklist, had you known about it。在您的方案中,它看起来像是“任意自定义标记”,您的假设HTML Purifier配置将允许它通过。<iframe srcdoc="...">
would have been a good attribute to blacklist, had you known about it。这看起来像HTML Purifier的自定义属性,并且已被允许。你看到了问题。这就是HTML Purifier不允许您信任任意自定义标签的原因。
我建议教HTML HTML Purifier所有自定义标签和属性。如果它们不是完全随意的,这种方法确实有帮助。我不得不将许多自定义Outlook标记和属性编码到一个项目的HTML Purifier中 - 虽然开发很乏味,但净增益(强大的安全性)是值得的。
如果您决定伪造该路径,请查看“Enduser: Customize”文档。
页面上的示例尝试实现{1}},HTML Purifier本身不支持该<form>
。从用例的角度来看,它不是技术上一个自定义元素,但它足以说明这个过程:
多汁!有了这个,我们可以回答五个问题中的四个:
- 元素的名称是什么?的形式强>
- 此元素属于哪个内容集? 阻止(这需要一点点调查,我发现最简单的方法是在DTD中搜索FORM并确定它所在的位置。)
- 这个元素允许的孩子是什么? 一个或多个流元素,但没有嵌套表单
- 元素允许的一般属性是什么?的通用强>
- 元素允许哪些属性特定于此元素? 一大堆,见ATTLIST;我们将做重要的事情:
醇>action
,method
和name
某些代码的时间:
$config = HTMLPurifier_Config::createDefault(); $config->set('HTML.DefinitionID', 'enduser-customize.html tutorial'); $config->set('HTML.DefinitionRev', 1); $config->set('Cache.DefinitionImpl', null); // remove this later! $def = $config->getHTMLDefinition(true); $def->addAttribute( 'a', 'target', new HTMLPurifier_AttrDef_Enum( array('_blank','_self','_target','_top') ) ); $form = $def->addElement( 'form', // name 'Block', // content set 'Flow', // allowed children 'Common', // attribute collection array( // attributes 'action*' => 'URI', 'method' => 'Enum#get|post', 'name' => 'ID' ) ); $form->excludes = array('form' => true);
每个参数对应于我们提出的问题之一。 请注意,我们在action属性的末尾添加了一个星号 表明它是必需的。如果有人指定没有它的表格 属性,标签将被砍掉。另外,最后的额外线是a 防止表单嵌套在其中的特殊额外声明 彼此。