HTMLPurifier Library删除所有自定义标记

时间:2017-06-15 05:35:24

标签: htmlpurifier

我正在使用4.0.0版本的htmlpurifier库,我的所有请求都被库清理。有时我们需要允许一些不属于标准定义的任意自定义标签和xml标签。这里库删除了所有不受支持的库。

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

有没有办法在图书馆实现这一目标?

1 个答案:

答案 0 :(得分:1)

简短回答

没有

长答案

一般来说,HTML Purifier的原则是白名单。这意味着它必须知道所有合法的星座,并且会丢弃它不承认的任何东西。

即使您使用HTML.ForbiddenElements将HTML Purifier置于黑名单模式,这也是辅助设计功能。 HTML Purifier仍然坚持知道它所提供的所有元素和属性,并将删除其他任何内容。

为什么要限制?

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

考虑HTML5 Security Cheatsheet。如果您在浏览器支持HTML5之前实施了黑名单方法,那么您可能没有意识到:

你看到了问题。这就是HTML Purifier不允许您信任任意自定义标签的原因。

怎么做

我建议教HTML HTML Purifier所有自定义标签和属性。如果它们不是完全随意的,这种方法确实有帮助。我不得不将许多自定义Outlook标记和属性编码到一个项目的HTML Purifier中 - 虽然开发很乏味,但净增益(强大的安全性)是值得的。

如果您决定伪造该路径,请查看“Enduser: Customize”文档。

页面上的示例尝试实现{1}},HTML Purifier本身不支持该<form>。从用例的角度来看,它不是技术上一个自定义元素,但它足以说明这个过程:

  

多汁!有了这个,我们可以回答五个问题中的四个:

     
      
  1. 元素的名称是什么?的形式
  2.   
  3. 此元素属于哪个内容集? 阻止(这需要一点点调查,我发现最简单的方法是在DTD中搜索FORM并确定它所在的位置。)
  4.   
  5. 这个元素允许的孩子是什么? 一个或多个流元素,但没有嵌套表单
  6.   
  7. 元素允许的一般属性是什么?的通用
  8.   
  9. 元素允许哪些属性特定于此元素? 一大堆,见ATTLIST;我们将做重要的事情:actionmethodname
  10.         

    某些代码的时间:

    $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   防止表单嵌套在其中的特殊额外声明   彼此。