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

2024-03-20

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

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

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

我尝试了这里的例子HTML Purifier - 更改默认允许的 HTML 标签配置 https://stackoverflow.com/questions/13261271/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>

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

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

  • HTMLPurifier,检查整个 HTML 文档 https://stackoverflow.com/q/1509268/245790
  • 允许在 HTMLPurifier 中解析完整的 html https://stackoverflow.com/q/24037016/245790

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

一般来说,这已经在 HTML Purifier 论坛上讨论过几次了(例如在允许 HTML、HEAD、STYLE 和 BODY 标记 http://htmlpurifier.org/phorum/read.php?3,6909,6909) - 但简而言之,如果没有大量的工作,您就无法做到这一点,不幸的是,我目前不熟悉任何通过简单的复制和粘贴来解决此问题的代码片段。

因此,您必须深入研究 HTML Purifier 的内部结构。

您可以使用以下方法教授 HTML Purifier 大多数标签和相关行为上的说明定制!文档页 http://htmlpurifier.org/docs/enduser-customize.html。对您来说最有趣的部分是靠近底部的部分,例如<form>被教导 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);

每个参数都对应于我们提出的问题之一。 请注意,我们在操作属性的末尾添加了一个星号 表明这是必需的。如果有人指定了没有该形式的表格 属性,该标签将被砍掉。另外,末尾的额外行是 防止表单嵌套的特殊额外声明 彼此。

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

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

选择

如果这看起来工作量太大,而您有其他消毒方法 http://htmlpurifier.org/comparison文档的标题部分和正文属性,您还可以将文档切成碎片,分别清理碎片,然后小心地将它们粘在一起。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 htmlpurifier 允许传递整个文档,包括 html、head、title、body 的相关文章

  • 如何覆盖 Symfony2 包中的实体

    我在用着FOS用户包 for Symfony2 我需要能够注册一个用户不验证电子邮件是否唯一 我只需要一个有效的电子邮件 所以许多用户可以拥有相同的电子邮件 我知道这很奇怪 但我需要它 我在捆绑包中有一个实体 用户 扩展 FOSUserBu
  • Symfony2 - 扩展 RememberMe 成功处理程序

    我想在某人刚刚使用 Symfony2 中的 记住我 功能登录后执行一个小的 PHP 操作 我已经看到了这一点 但不知道如何扩展它 http api symfony com 2 3 Symfony Component Security Htt
  • 在学说监听器中插入元素

    我已经设置了一个学说监听器 它在不同的数据库操作上触发并创建一个日志实体并将其插入数据库 class FOO public function onFlush OnFlushEventArgs args foreach args gt get
  • php 中的 PDOException“找不到驱动程序”

    我已经在 Linux 系统上安装了 Lampp 并且正在学习 symfony2 同时尝试使用 symfony2 命令创建架构 php app console doctrine schema create 我收到以下错误消息 PDOExcep
  • Api-Platform:使用 PUT 创建资源

    我想使用 PUT 方法来创建资源 它们由 UUID 标识 并且由于可以在客户端创建 UUID 因此我想启用以下行为 在 PUT api myresource 4dc6efae 1edd 4f46 b2fe f00c968fd881 上 如果
  • 清理 AntiXSS v3 输出中的 html 编码文本(#decimal notation)

    我想在 XSS 安全的博客引擎中发表评论 尝试了很多不同的方法 但发现非常困难 当我显示评论时 我首先使用微软AntiXss 3 0 http www codeplex com AntiXSS对整个内容进行 html 编码 然后我尝试使用白
  • Symfony 功能测试失败,但相同的请求在浏览器中有效

    我跟着Symfony 文档 http symfony com doc current book testing html functional tests关于功能测试 以便编写我的第一个测试 但我有一些问题 我通过浏览器得到的响应效果很好
  • 作曲家安装不断消耗所有 RAM 内存

    在我正在开发的 Symfony 2 7 项目中 我通过 Composer 1 6 5 使用了很多包 几天后我无法再添加新包或重建composer lock 它总是内存不足 当我尝试添加新包时 我开始注意到这个问题 但问题不在于那个包 因为作
  • 更新 Doctrine 后 Symfony 中的“ObjectManager 和 EntityManagerInterface 之间的兼容性”是什么?

    在我的 Symfony 项目中尝试更新 composer update 后出现错误 我寻找解决方案 发现有必要修改实体和构造函数中的使用和类型提示 我已经完成了 然后 我重新启动更新 但出现了不同的错误 并且更新未完全完成 结果 我的网站已
  • Symfony2 KnpMenuBundle:设置活动菜单项,即使它不在该菜单上

    我创建了菜单生成器并且它可以工作 我的路线之一是 database 但这有一个子路线 database view id 我不想将视图路线放入菜单项中 因为没有 ID 它就无法工作 但我希望当用户在视图上时数据库路由处于活动状态 我怎样才能做
  • Symfony 不会从集合中删除实体

    我知道一般来说有很多关于这个主题的帖子 不幸的是 这些大多涉及对数据库的实际持久操作 就我而言 我在持久操作之前发生了一个问题 我有一个带有实体 学说 持久性集合的表单 您可以通过 javascript 从 DOM 中删除 对象 提交后 当
  • Doctrine/Symfony 如何使用数组中的特定数据更新实体

    我环顾四周太久了 但没有运气 我的情况是 我有一个有点大的表 60 列 在 Doctrine Entity 中表示 在 FosREST 上工作 我想要实现的是 我想发送带有特定数据的 JSON 例如 phone gt new phone n
  • Doctrine ORM 按注释对象字段排序

    所以它很简单 我在某个实体中有以下代码 var ServiceOffer ORM OneToMany targetEntity ServiceOffer mappedBy serviceProvider ORM OrderBy servic
  • 如何捕获 Symfony2/Silex 中的错误和异常?

    我想在我的 Silex 应用程序中捕获错误和异常 将它们包装在始终返回给客户端的自定义 JSON 响应中 我发现了三种基本方法 app gt error Symfony Component Debug ErrorHandler regist
  • Symfony:为什么 isInitialized 总是 false?

    我用教义查询了一个用户 customer this gt getDoctrine gt getRepository DemoUserBundle Customer gt find 1 但我得到了结果 顾客 1441 已初始化 错误的 ID
  • symfony docker 缓存文件的权限问题

    我有一个带有 docker compose 的 docker symfony 设置 它运行良好 除非我运行缓存 清除Web 服务器可以从控制台访问这些文件 我可以通过取消注释来规避权限问题掩码 0000 在控制台和 web app dev
  • PHP:会话 |无法解码会话对象

    我尝试将电子商务功能添加到遗留项目中 因此我仍然需要旧的会话处理程序 我使用 PHP v7 1 14 和 Session2DB https github com voku session2db tree 4 0 0 https github
  • Git 无效的修订范围 Symfony2 Composer 外部包

    RuntimeException Failed to execute git log 18efcf67d236d5bbf46ac67820250dffd0474b6e 94e2146f525fa1367e15646fa273e5b34f92
  • 防止 Twig 函数扩展中的输出转义

    我创建了一个 Twig 扩展 image image png 200 嗨 我知道我可以做 image image png 200 raw 但我更喜欢使用 PHP 代码 这样所有内容 来自这个 图像 扩展 都不会被转义 我看不出这可能 我知道
  • Symfony2动态添加事件监听器

    如何在不使用 services yml 模式的情况下动态地将事件侦听器 在我的例子中是一个学说事件 添加到内核 在深入研究了供应商目录之后 我自己找到了答案appProdProjectContainer php文件 如果您希望使用事件管理器

随机推荐