【问题标题】:PHP Securely view untrusted email content in browserPHP 在浏览器中安全地查看不受信任的电子邮件内容
【发布时间】:2023-02-11 10:21:06
【问题描述】:

在浏览器(PHP)中安全地查看电子邮件的推荐方法是什么?

电子邮件是高度不安全的内容,桌面电子邮件软件显然只实现了非常有限的 HTML 子集,根本没有 javascript 来防止攻击。但是,如果我获取电子邮件 HTML 源代码并将其显示在浏览器中,则会执行 javascript 代码和其他内容。

我认为一个解决方案是发送这样的标头以及电子邮件源:

header("Content-Security-Policy: sandbox");

但这会阻止我从服务器获取内联图像,因为我仍然需要传输 PHP 会话 ID 以了解允许用户获取此内容。

由于有许多 Web 电子邮件客户端,我想知道是否有最佳实践模型。

(仅供参考:我尝试实现自己的网络电子邮件工具,以满足更大软件套件的特定需求)

【问题讨论】:

    标签: php webmail


    【解决方案1】:

    通过不需要身份验证然后使 URL 难以猜测来解决图像问题(例如:<img src="/resources/SomeReallyLongHardToGuessRandomString">)。

    但更广泛地说,安全地显示用户生成的 HTML 是很困难的。就像真的很难。在这种情况下,您应该使用库。请记住,您可能有一个用户使用的浏览器对于 Content-Security-Policy 标头来说太旧了。该浏览器会很乐意在页面上运行任何脚本。 HTML Purifier 是我个人的选择,但还有其他选择。另外,请记住,这是一个您需要经常更新的依赖项,因为人们会不断发现新的错误。

    作为一道额外的防线,许多站点为用户生成的内容使用单独的域。例如,Google 使用 googleusercontent.com。这样一来,如果确实有什么事情发生了,他们就不会妥协所有的应用。请注意,这仍然很糟糕,因为攻击者可能能够读取他们不应读取的用户内容(在本例中为电子邮件)。

    【讨论】:

    • 此外,谷歌搜索应该可以找到开源邮件服务器,如 roundcube 和 squirrelmail,这样你就可以获得它们的源代码并查看它们的功能。分叉现有服务器也可能比重新发明轮子更好、更容易。
    【解决方案2】:

    我最终决定修改电子邮件的 HTML 源代码(在我的 php 脚本中)以将内联图像作为 HTML 源代码中的 base64 编码数据提供。因此不需要额外加载图像:

    <img src="data:image/gif;base64,R0lGODlhDgE3APf/ALJUMt3W0aMyFPTixGRHOXNXSvnu3b1sSu7SpPLduurTxapEIvbly/bq4+bAffTo31Q1J/369dGafaAtDO3o5ePd2c6Tdfz6+a9...">
    

    这将解决当前显示电子邮件的问题,因为这样我就可以保留我的

    header("Content-Security-Policy: sandbox");
    

    因为这是防止攻击成功的一种主要方式。此外,为了增强安全性,我计划再次查看 roundcubemail,看看我是否发现他们是如何处理这个问题的,并且还使用 HTMLpurifier 进一步从可能的威胁中剥离电子邮件源。

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2012-11-24
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      相关资源
      最近更新 更多