【问题标题】:how to use htmlpurifier to allow entire document to be passed including html,head,title,body如何使用 htmlpurifier 允许传递整个文档,包括 html、head、title、body
【发布时间】:2017-01-05 22:24:56
【问题描述】:

鉴于下面的代码,我如何使用 htmlpurifier 让整个内容通过。我想允许整个 html 文档,但 html、head、style、title、body 和 meta 被剥离。

我什至尝试过$config->set('Core.ConvertDocumentToFragment', false),但没用。

任何关于从哪里开始的帮助将不胜感激。

我在这里尝试了HTML Purifier - Change default allowed HTML tags configuration 的示例,但它不起作用。我不断收到不允许使用标签的例外情况。注意:我确实在 HTML.Allowed 中添加了上面的所有标签,但似乎没有任何效果。

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" />
    <title>Hello World - Email Template</title>
    <style type="text/css">
    @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,600);
    body{-webkit-text-size-adjust: none;-ms-text-size-adjust: none;margin: 0;padding: 0;}
    </style>
    <body>
    <h1>Hi there</h1>
    </body>
    </html>

【问题讨论】:

    标签: symfony xss htmlpurifier


    【解决方案1】:

    默认情况下,HTML Purifier 只知道在 &lt;body&gt; 上下文中有效的标签,因为这是它的预期用例。基本上,它实际上并不知道&lt;meta&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt; 标签是什么——这很重要,因为它的大部分安全性依赖于理解 HTML 的语义基础!

    关于这个主题有一些旧的 stackoverflow 问题:

    ...但是他们目前没有非常有用的答案,所以经过一番思考,我认为您的问题仍然有可取之处,并会在这里回答。

    一般来说,这已经在 HTML Purifier 论坛上讨论过几次(例如在 Allow HTML, HEAD, STYLE and BODY tags 中) - 但简而言之,如果没有大量工作,您将无法做到这一点,不幸的是,我目前还没有熟悉任何通过简单复制和粘贴即可解决此问题的 sn-p 代码。

    因此,您将不得不深入研究 HTML Purifier。

    您可以使用the instructions on the Customize! documentation page 教授 HTML Purifier 大多数标签和相关行为。您最感兴趣的部分将在底部附近,这是一个将 &lt;form&gt; 教授给 HTML Purifier 的示例。从那里引用一些后代:

    $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 属性的末尾添加了一个星号 表示它是必需的。如果有人指定一个没有那个的表格 属性,标签将被砍掉。此外,末尾的额外行是 防止表单嵌套的特殊额外声明 彼此。

    您必须对您想要支持的 &lt;body&gt; 标记之外的所有标记执行类似的操作(一直到 &lt;html&gt;)。

    注意:即使您将所有这些标签添加到 HTML Purifier,您发现的设置 Core.ConvertDocumentToFragment 也需要设置为 false(正如您所做的那样)。

    替代方案

    如果这看起来工作量太大,并且您的文档具有 other ways to sanitise 的 header 部分和 body 属性,您还可以将文档切成小块,分别消毒,然后小心地将它们粘在一起。

    p>

    (当然,也可以对整个文档使用替代方案。)

    【讨论】:

      【解决方案2】:

      快速解决方法。编辑 Lexer.php 的函数 extractBody()

      public function extractBody($html)
          {
              return $html;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        • 1970-01-01
        相关资源
        最近更新 更多