【问题标题】:Why not use email address in unsubscribe link为什么不在取消订阅链接中使用电子邮件地址
【发布时间】:2011-08-13 10:18:50
【问题描述】:

请给我几个为什么不在我们的时事通讯中包含取消订阅链接的纯文本形式的电子邮件地址的理由。

现在是:

xyz.net/unsubscrible?uid=123&email=user@domamin.com

我正在争取:

xyz.net/unsubscrible?uid=123&key=(encrpted_email_md5hash).

我不太喜欢以纯文本形式提供电子邮件地址的想法,但需要说服我的经理注意可能的威胁。

更新:虽然所有答案都在建议我应该如何保护它,而不是为什么我应该保护它,但我发现 do-ob 的答案最合适。

【问题讨论】:

  • 网址是http还是https
  • 你有一个表映射 uid 123 到 user@domain.com 吗?
  • 它的http,是的123对应于db中存储的email地址..

标签: security email email-spam unsubscribe


【解决方案1】:

由于您没有使用https,因此可以窥探查询参数。对于移动用户以及在咖啡店等有免费 Wi-Fi 的地方使用笔记本电脑的用户来说,这是一个严重的问题。

而且由于 uid 已经映射到电子邮件地址,因此您无需将电子邮件地址等识别信息暴露给窥探者。

您确实需要确保不会在他们单击链接后立即取消订阅。这是一个 GET URL,它应该是幂等的(参见 9.1 部分),这意味着它不应该有权更改底层数据库。

而且我不应该仅仅通过知道你的电子邮件地址来取消订阅你,如果 uid 是可猜测的或不需要的,我可以通过伪造 URL 来取消订阅。

【讨论】:

    【解决方案2】:

    因为这样您就可以取消订阅其他人。理想情况下,您只想使用一个键:

    xyz.net/unsubscrible?key=<some unique cryptographic hash>
    

    我不应该能够猜测 ID 和电子邮件并导致其他人发生某些操作。

    【讨论】:

      【解决方案3】:

      为什么不呢?不要包含它因为它不需要。这些数据是用来做什么的?建议我们不要在查询字符串中包含我们实际上不需要的任何内容。

      唯一真正需要的是唯一标识符。看起来您在查询字符串中已经有了一个唯一标识符:uid

      一个潜在的问题:是什么阻止我自动创建退订 URL 并将 ?uid= 从 1 提高到 1000 万?

      建议:为表中的每个用户创建一个用户 guid。将其用作您的退订令牌。它不会被猜测或容易受到自动攻击。

      foo.com/unsubscribe?u=<guid>
      

      【讨论】:

      • 我正在拍摄 uid 作为密钥和另一个安全哈希,用于确保您提到的事情不会发生...... guid 需要在数据库中维护它们......这不是一个坏主意,但它如果我能避免它会很棒......
      • @xoail:guid 的好处是无需维护;在列上设置默认值(即 SQL Server 中的NewID()),或者在创建新用户时在您的应用程序中进行更改。
      • 是的,这是一个很好的观点......但回到我的问题......为什么不使用纯文本的电子邮件地址?什么是安全漏洞...
      • 这是KISS原则最基本的应用。显然,它不是必需的,它没有任何用途,而且它不必要地使代码过于复杂。甚至在不考虑安全隐患的情况下,您不必证明为什么应该删除它。你的老板应该证明为什么应该添加它。
      【解决方案4】:

      我可以给你一个非常棘手的答案,但你会发现拥有完整的电子邮件地址并不是一个坏主意。

      恶意代理(即来自公共场所)可能会使用包含电子邮件地址的 URL 来存储地址并发送垃圾邮件。但如果我认为公共场所有恶意,最好在公共计算机上安装键盘记录器,做得更糟。

      另一点可能是:如果您向有价值的客户发送电子邮件,攻击者可能会伪造电子邮件地址并取消订阅,实际上会降低您的沟通强度。为此,您可以在您的 URL 中添加一个加密校验和(不需​​要 CAPTCHA,人们在退订时不喜欢它),然后通过加密(或仅以不明显的方式编码)整个邮件地址,您可以解决没有使用两个参数的问题。

      【讨论】:

        【解决方案5】:

        我收到的几乎每份时事通讯的底部都有免责声明,例如:

        此电子邮件已发送至 YourName@Domain.com。要退订,请点击此链接:xxxx

        我发现在时事通讯中明确列出我自己的电子邮件地址很有帮助。 电子邮件地址是否在取消订阅链接中,对我来说似乎无关紧要。


        假设您没有在邮件的实际文本中或在退订链接中发布电子邮件地址。电子邮件地址仍在电子邮件标题中。因此,我并没有真正看到在取消订阅链接中隐藏它的必要性或理由。

        【讨论】:

        • 对,我的经理就是这么说的,但我还没有遇到一个(在我的订阅中)将电子邮件以纯文本形式显示的取消订阅链接……我的公司这样做真的让我很困扰在纯文本中,我只是认为我们应该改变...... :)
        【解决方案6】:

        我同意,如果您有不同的唯一标识用户的方法,则不需要电子邮件地址。唯一的原因可能是向用户表明他/她订阅的电子邮件地址,但它也已过时,因为他/她显然收到了电子邮件。

        【讨论】:

          【解决方案7】:

          我猜 uid 是“用户 ID”。如果您知道用户 ID,那么您应该能够从中确定电子邮件地址吗?似乎在 url 中有电子邮件并没有做任何事情。我想如果您不必包含个人信息,那么最好不要这样做。

          【讨论】:

            【解决方案8】:

            出于同样的原因,银行没有类似的链接

            bank.com/applycredit?ssn=123456789&name=john+smith&dob=19500101&married=true&address=...
            

            它很容易被拦截和解释。

            【讨论】:

            • 不完全正确。电子邮件的目标地址是纯文本的:它一开始就可以被窃听,所以在 URL 中包含它可以被视为一种简单的冗余
            • 是的...但我需要知道为什么不包含电子邮件...因为如果发生某些事情,它并不是那么重要但至关重要...需要知道一些事情;)
            • 在这种情况下,黑客不会知道内容,而现在,他们知道user@domain.com 在某个时候订阅了xyz.net 并且正在取消订阅。信息是金。将user@domain 替换为abcd@senate,将xyz.net 替换为warezxxx.net,你就有了小报的黄金。
            猜你喜欢
            • 2012-12-02
            • 2016-03-28
            • 2019-11-26
            • 2011-03-24
            • 1970-01-01
            • 1970-01-01
            • 2011-10-10
            • 2013-08-31
            • 2022-01-21
            相关资源
            最近更新 更多