7

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

现在是:

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

我正在推动:

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

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

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

4

8 回答 8

8

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

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

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

于 2011-04-26T22:58:09.447 回答
6

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

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

它很容易被拦截和解释。

于 2011-04-26T22:44:30.537 回答
5

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

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

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


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

于 2011-04-26T22:45:10.147 回答
3

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

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

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

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

foo.com/unsubscribe?u=<guid>
于 2011-04-26T22:55:23.353 回答
1

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

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

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

于 2011-04-26T22:54:37.987 回答
1

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

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

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

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

于 2011-04-26T23:57:10.240 回答
1

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

于 2011-04-26T22:44:38.940 回答
1

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

于 2011-04-26T22:44:51.420 回答