Symfony 如何使用htmlpurifier允许传递整个文档,包括html、head、title和body

Symfony 如何使用htmlpurifier允许传递整个文档,包括html、head、title和body,symfony,xss,htmlpurifier,Symfony,Xss,Htmlpurifier,给出下面的代码,我如何使用htmlpurifier来允许整个内容通过。我想允许整个html文档,但html、标题、样式、标题、正文和元数据被剥离 我甚至尝试了$config->set'Core.ConvertDocumentToFragment',false,但没有成功 如果您有任何关于从何处开始的帮助,我们将不胜感激 我在这里试过这个例子,但不起作用。我不断收到不允许使用标签的例外情况。注意:我确实在HTML中添加了上面的所有标记。允许,但似乎没有任何效果 <html xmlns="ht

给出下面的代码,我如何使用htmlpurifier来允许整个内容通过。我想允许整个html文档,但html、标题、样式、标题、正文和元数据被剥离

我甚至尝试了$config->set'Core.ConvertDocumentToFragment',false,但没有成功

如果您有任何关于从何处开始的帮助,我们将不胜感激

我在这里试过这个例子,但不起作用。我不断收到不允许使用标签的例外情况。注意:我确实在HTML中添加了上面的所有标记。允许,但似乎没有任何效果

<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>

默认情况下,HTML净化器只知道上下文中有效的标记,因为这是它的预期用例。基本上,它并不知道什么是标记,这是一件大事,因为它的大部分安全性依赖于理解HTML的语义基础

关于此主题,有一些较老的问题:

…但他们目前没有非常有用的答案,所以经过深思熟虑,我认为你的问题仍然有价值,我将在这里回答

一般来说,这已经在HTML净化器论坛上讨论过好几次了,例如在-中,但简而言之,如果没有大量的工作,你就无法做到这一点,不幸的是,我目前还不熟悉通过简单的复制和粘贴来解决这一问题的任何代码片段

所以你必须深入挖掘HTML净化器的精髓

您可以通过使用来教授HTML净化器大多数标记和相关行为。你最感兴趣的部分是底部附近,这是一个学习HTML净化器的例子。为后人引述:

$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属性的末尾添加了一个星号 表示它是必需的。如果有人指定了一个没有这个的表单 属性,则标记将被删除。另外,末尾的额外行是 防止表单嵌套在其中的特殊额外声明 彼此

您必须对您希望一直支持的标记之外的所有标记执行类似的操作

注意:即使您将所有这些标记添加到HTML净化器,您发现的设置Core.ConvertDocumentToFragment也需要像您所做的那样设置为false

另类

如果这看起来工作量太大,并且您有文档的标题部分和正文属性,那么您也可以将文档分成若干部分,分别对这些部分进行消毒,然后小心地将它们粘在一起


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

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

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