给我几个理由,为什么不以明文形式包含电子邮件地址,以便在我们的新闻稿中发送取消订阅链接。
现在是:
xyz.net/unsubscrible?uid=123&email=user@domamin.com
我正在推动:
xyz.net/unsubscrible?uid=123&key=(encrpted_email_md5hash).
我真的不喜欢以纯文本形式发送电子邮件地址的想法,但需要说服我的经理可能存在威胁。
更新:虽然所有的答案都表明我应该如何保护它并且没有理由我应该保护它,但我发现do-ob的答案是最合适的。
答案 0 :(得分:7)
出于同样的原因,银行没有像
这样的链接bank.com/applycredit?ssn=123456789&name=john+smith&dob=19500101&married=true&address=...
它很容易被拦截和解释。
答案 1 :(得分:7)
因为那时你可以取消订阅其他人。理想情况下,您只想使用密钥:
xyz.net/unsubscrible?key=<some unique cryptographic hash>
我不应该猜测ids和电子邮件,并导致其他人采取某些行动。
答案 2 :(得分:5)
我得到的每一份通讯都在底部有一个免责声明,例如:
此电子邮件已发送至YourName@Domain.com。要取消订阅,请单击此链接:xxxx
我在简报中发现我自己的电子邮件地址的明确列表是有帮助的。 电子邮件是否在取消订阅链接中,似乎与我无关。
假设您未在邮件的实际文本或取消订阅链接中发布电子邮件地址。电子邮件地址仍在电子邮件标题中。因此,我并没有真正看到在取消订阅链接中隐藏它的背后的需要或推理。
答案 3 :(得分:3)
为什么不呢?不要包含,因为它不需要。那些数据用于什么?建议我们不要在查询字符串中包含任何我们实际上不需要的内容。
实际需要的唯一标识是唯一标识符。看起来你已经在查询字符串中有了一个唯一的标识符:uid
。
一个潜在的问题:是什么阻止我自动创建取消订阅的网址并点击?uid=
从1到1千万?
建议:为表中的每个用户创建一个用户guid。将其用作取消订阅令牌。它不会被自动攻击所猜测或容易受到攻击。
foo.com/unsubscribe?u=<guid>
答案 4 :(得分:1)
我猜这个uid是'用户ID'。如果您知道用户ID,那么您应该能够确定该权限的电子邮件地址吗?好像让网址中的电子邮件没有做任何事情。我想如果你不需要包含个人信息,那么最好不要这样做。
答案 5 :(得分:1)
如果您使用不同的方法来唯一标识用户,我同意您不需要电子邮件地址。唯一的原因可能是向用户指出他/她订阅的电子邮件地址,但由于他/她显然收到电子邮件,因此它也已过时。
答案 6 :(得分:1)
我可以给你一个非常棘手的答案,但你会发现拥有完整的电子邮件地址并不是一个坏主意。
恶意代理(即来自公共场所)可能会使用包含电子邮件地址的URL来存储地址和发送垃圾邮件。但是,如果我认为公共场所有恶意的东西,最好在公共电脑上安装一个键盘记录器,做得更糟。
另一点可能是:如果您向有价值的客户发送电子邮件,攻击者可能伪造电子邮件地址并取消订阅,实际上会降低您的沟通能力。为此,您可以为您的URL添加加密校验和(不需要CAPTCHA,人们在取消订阅时不喜欢它),但是然后通过加密(或者只是以非显而易见的方式编码)您可以解决的整个邮件地址没有使用两个参数的问题。
答案 7 :(得分:1)
由于您未使用https
,因此可以窥探查询参数。对于移动用户和笔记本电脑用户而言,这是一个严重的问题,这些用户可以使用像咖啡店这样的免费Wi-Fi。
由于uid已映射到电子邮件地址,因此您无需向窥探者公开识别信息,如电子邮件地址。
您确实需要确保在点击链接后不会发生取消订阅。这是一个GET URL,它应该是幂等的(参见9.1部分),这意味着它不应该有权更改底层数据库。
如果uid是可猜测的或不需要的话,我只能通过知道你可以通过伪造URL来做的电子邮件地址取消订阅。