【问题标题】:PHP - Securing a users full HTML file against XSSPHP - 保护用户的完整 HTML 文件免受 XSS 攻击
【发布时间】:2020-03-04 15:39:49
【问题描述】:

我目前正在开发一个使用 PHP(具体为 LAMP)的电子邮件模板构建网站,该网站允许用户粘贴其 HTML 电子邮件代码,然后将其发送给他们的客户。

显然,在处理此类数据时,我需要实现某种 XSS 安全性。几个星期以来,我一直在网上皱眉,试图找到解决方案,但发现的好方法很少,但它们实际上不适用于完整的 HTML 文档(这是我要处理的)。

这些是我找到的解决方案以及为什么它们对我不起作用:

HTMLPurifier

我认为这对大多数人来说是显而易见的选择,因为它具有最好的安全性并且符合最新的行业标准。虽然它的主要用途应该是用于 HTML 片段/小型 sn-ps,但我想我会试一试。

我遇到的第一个问题是头部标签(以及其中的任何东西)被剥离和移除。头部在 HTML 电子邮件中非常重要,因此我必须找到解决方法……不幸的是,我能找到的唯一解决方法是将头部与电子邮件的其余部分分开,并通过 HTMLPurifier 单独运行每个部分。

我还没有尝试过,因为它看起来很hacky,但它似乎是实现我所追求的唯一方法。我也不确定 HTMLPurifier 在 CSS 中查找 XSS 的能力如何。最重要的是,它是一个如此庞大的库,在性能方面表现不佳。

HTMLawed:

HTMLawed 似乎是另一个不错的选择,但有几件事让我放弃了使用它。

A) 与 HTMLPurifier 相比,这似乎不太安全。 HTMLawed 目前有几个记录在案的安全问题。它还没有被广泛使用,这更令人担忧(只有大约 10 家注册公司使用)。

B) 它是根据 GPL/GPU 许可发布的,这实际上意味着我不能在我的网站上使用它,除非我愿意让人们免费使用我的服务。

C) 从我看到的人们谈论它的情况来看,它似乎去除了很多标签,除非它被大量配置。我在这里不能说太多,因为我没有尝试过,但这也引起了我的安全问题——如果我错过了什么怎么办?如果我不能配置它来保留我想要的元素怎么办?等等


这些是我要问你的问题:

  1. 是否有比上面列出的更好的替代品?
  2. 是否可以自己编写代码,还是过于雄心勃勃且太不安全?
  3. 较大的电子邮件公司如何解决这个问题(mailchimp、activecampaign、sendinblue 等)?

【问题讨论】:

  • 你使用的是纯 PHP 还是 Laravel 之类的框架?
  • @THEWOLF 纯 PHP
  • 对于您的 HTML Purifier 问题,这可能会对您有所帮助:stackoverflow.com/a/41510846/245790 - 虽然答案是“有可能,但需要大量工作”。我个人认为这是值得的(也许聪明的谷歌搜索会产生一个有人为你做这件事的 github 项目),但是 YMMV。祝你好运!

标签: php xss htmlpurifier


【解决方案1】:

您似乎正在发送 HTML 内容。所以你不能过滤它们。您必须将 HTML 存储在数据库中。如果您使用 XSS 证明过滤它们,则 HTML 将无法正常工作。默认情况下,所有 Webmail 服务都默认禁用 Javascript,如 GMail、Yahoo、Roundcube 等。

如果您使用像 CKEditor 这样的所见即所得,它会自动删除所有 <script> 标签以及某些未知属性。但是您仍然可以通过CKEditor.config() 将其设置为接受的内容和删除的内容。

如果您的 PHP 由于某些特殊字符而无法插入数据库,那么您可以使用 SQL 准备语句或使用 base64_encode() 将 HTML 输入编码为 base64,然后在 mail()PHPMailer::Body 中使用时对其进行解码。

【讨论】:

  • 朋友,你还没理解我的问题。无论实际发送和编码 html,我都想在我网站上的编辑器中对其进行 XSS 证明。我知道 Google、Outlook 和所有其他公司确实阻止了 XSS 攻击,但我特意谈论的是用户在我的网站上查看 HTML 的时间。
  • @FatDude22222 你想避免什么样的 XSS 攻击?尝试使用 CKEditor 或 tinyMCE 编辑器,它将删除<script> 标签和<iframe>。如果你想查看 HTML 内容,硬性的 XSS 证明就可以了。但是,如果您想显示 HTML 代码,请在编辑器中回显时尝试使用 htmlenitites() 函数。
  • 你应该在你的问题中加入一些代码。以及样本输入和预期输出。
  • 1) 所有 XSS 攻击,我都不愿意发生。 2) 单纯依靠客户端脚本来处理 XSS 是非常糟糕的做法,应该在服务器端完成。 3)“如果你想查看 HTML 内容,很难通过 XSS 证明”——我知道,这就是我在这里的原因。 4) htmlenitites() 在这里没用。使用 HTML,您不想转义每一个非字母字符。 5)关于我的问题,HTML 都是一样的。正如我在 OQ 中所说,这是一封完整的 HTML 电子邮件,所述 HTML 电子邮件的内容对于回答我的问题并不重要。
  • 据您所知,放置<h1>标签被视为XSS攻击。如果你也想避免<h1>,那么你可以使用htmlspecialchars() 函数。但这会使您的 HTML 无法查看。放一些代码和预期的输出值。客户端过滤器不好。我们注意到了这一点。试试 PHP HTML DOM 文档类。它可以在将 HTML 存储到数据库之前从服务器端删除您想要避免的某些标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2017-04-07
  • 2015-12-08
  • 1970-01-01
相关资源
最近更新 更多