如何使用htmlpurifier允许传递整个文件,包括html,head,title,body

时间:2017-01-05 22:24:57

标签: symfony xss htmlpurifier

鉴于下面的代码,我如何使用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>

2 个答案:

答案 0 :(得分:0)

默认情况下,HTML Purifier只知道在<body>上下文中有效的标记,因为这是它的预期用例。基本上,它实际上并不知道<meta><html><head><title>标记是什么 - 这是一个大问题,因为它的大部分安全性都依赖于理解HTML的语义基础!

有关此主题的一些旧的stackoverflow问题:

...但他们目前没有非常有用的答案,所以在经过一番思考后,我认为你的问题仍然有用,我将在这里回答。

一般来说,这已经在HTML Purifier论坛上讨论了几次(例如在Allow HTML, HEAD, STYLE and BODY tags中) - 但简而言之,如果没有大量的工作你就不能这样做,不幸的是我是目前不熟悉通过简单的复制和粘贴解决此问题的任何代码片段。

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

您可以使用the instructions on the Customize! documentation page向HTML Purifier教授大多数代码和相关行为。最有趣的部分将在底部附近,这是向HTML Purifier传授<form>的示例。从那里引用一些后人:

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

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

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

<强>替代

如果看起来工作太多,并且您的文档的标题部分和正文属性other ways to sanitise,您还可以将文档剪切成碎片,分别清理碎片,然后小心地将它们粘在一起。

(或者,当然,只需使用整个文档的替代方案。)

答案 1 :(得分:0)

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

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