电子邮件退订处理安全

信息安全 电子邮件 垃圾邮件
2021-08-15 14:57:29

还有一个类似标题的问题:安全退订, 但是我的问题完全解决了另一个问题。

我正在尝试在网站上设置一个通知系统,它将根据网站上的不同事件向用户发送电子邮件,例如接收来自另一个用户的现场消息、购买您的产品的人、留下反馈等。 - 有很多事情可能会触发通知。用户可以从他们的帐户设置中选择他们希望接收电子邮件的确切事件。

我正在阅读 mailgun https://documentation.mailgun.com/best_practices.html#unsubscribe-handling的电子邮件最佳实践

我了解到

让您的收件人能够取消订阅电子邮件非常重要。首先,它是 CAN-Spam Act 的要求。其次,如果你不给他们这个选项,他们更有可能点击垃圾邮件投诉按钮,这比让他们退订造成的伤害更大。最后,许多 ESP 会寻找退订链接,如果没有这些链接,他们更有可能过滤您的电子邮件。

此外,来自关于取消订阅的 gmail 指南 https://support.google.com/mail/answer/81126?hl=en

用户必须能够通过以下方式之一取消订阅您的邮件列表:

电子邮件正文中的显眼链接将用户引导至确认其取消订阅的页面(除确认外,无需用户输入)。通过使用退订请求回复您的电子邮件。

所以,我确实希望在电子邮件中有取消订阅选项。我不太喜欢使用第二个选项(通过回复您的电子邮件),因为它可能存在一些技术困难(例如,我必须在回复电子邮件中使用通知类型,必须定期检查收件箱的电子邮件,也许还有其他我有没想到)。我正在考虑在电子邮件中添加一个取消订阅链接,因为他们的通知设置只有在他们登录后才能更改,这与 gmail 的no input from the user, other than confirmation, should be required观点相矛盾。

所以,看起来我留下了一些“公共”网址来更改他们的通知设置。从我阅读并用于处理类似情况时开始 - 例如,在确认电子邮件或密码恢复时,我发送的电子邮件在 url 中仅包含随机生成的哈希(sha512),不会以任何方式泄露用户信息,这些信息将在更少的时间内过期超过 1 小时(我曾经放 15 分钟)。

现在,在取消订阅链接的情况下,即使我包含随机哈希(也可能是通知类型 ID),它与数据库中的用户相关联,因为它是公开的,如果电子邮件/链接意外共享或发布在某处,其他人可以编辑该用户的通知首选项。另一方面,为每个通知生成随机散列并保存在数据库中,也让它们在一段时间后过期对我来说听起来有点过头了,还考虑到当它过期时,如果用户点击旧电子邮件中的取消订阅链接,它将不起作用.

我在那里找不到任何有用的信息,所以我正在寻求一些关于如何正确和安全地处理用户退订的建议,特别是在与我类似的情况下。很感谢任何形式的帮助。

谢谢

3个回答

对于可用性和安全性不能齐头并进的情况,这是一个很好的例子。

用户想要可用性:他们希望能够点击链接并被取消订阅。他们希望这始终有效(不仅仅是收到电子邮件后的 X 时间,而且绝对不是 X 为 15 分钟或一个小时)。

您需要安全性:您不希望攻击者能够强制取消订阅您的用户。

现在让我们分析这些需求:

可用性

可用性是相当重要的。如果您不允许轻松退订:

  • 您的品牌将遭受形象损害
  • 您的电子邮件将被视为垃圾邮件
  • 您违反了 CAN-SPAM 法案(请参见此处:)The law also requires that the unsubscribe mechanism must be able to process opt-out requests for at least 30 days after the transmission of the original message

安全

因此,您使用的是安全生成的长随机令牌,这意味着攻击者不能通过暴力破解您的退订表单来退订大部分用户。

攻击者最多可以在单个用户以某种方式泄露他们的取消订阅令牌后取消订阅。

那么真正要担心的是什么?任何攻击者都不会使用社交工程来获取用户的退订令牌。他们也不会仅仅为了取消订阅您的时事通讯而侵入您用户的电子邮件或您的数据库。

因此,唯一可能的攻击场景是:用户不小心将您的时事通讯(包括他们的取消订阅令牌)发布到网站。有人看到这一点并决定取消订阅该用户。

这可能会给您和用户带来一点小烦恼,但这种情况不太可能经常发生。

结论

正确生成的随机令牌足以用于取消订阅链接。

此令牌被泄露的危险性很低,并且使用任何其他机制(例如要求登录或在短时间内使令牌过期)通常是不可接受的。

您最多可以在 30 天后使令牌过期。但这也意味着您需要为每个用户拥有多个令牌。

我可能会遗漏一些东西,但我认为您无论如何都不需要取消订阅。

与具有简单取消订阅功能相关的要求和最佳实践涉及本质上是电子邮件服务的服务,例如邮件列表、来自供应商的促销电子邮件等。

在您的情况下,您正在谈论发送给您的用户的通知,并表示他们可以通过他们的帐户设置页面控制通知。从本质上讲,您已经赋予他们控制权和取消订阅的能力。您需要做的就是在通知电子邮件的底部添加一个指向帐户设置页面 URL 的链接。任务完成。

为什么不让“取消订阅”链接将用户引导到受常规身份验证方法保护的页面?

也许https://example.org/preferences/notifications/在这里可以打开/关闭电子邮件消息。

这将与您用户的其他偏好选项一样安全,易于访问(假设您的用户能够回忆他们的登录详细信息)并将启用更细粒度的功能来调整电子邮件设置(例如选择每天/每周摘要)而不是二进制订阅/取消订阅。