我想在我们的电子邮件简报中自定义“取消订阅”链接,以便他们只需点击一下即可删除收件人。现在他们只是指向一个通用页面,用户必须输入他们的电子邮件地址并选择他们想要取消订阅的新闻通讯。
看起来这应该非常简单,即只包含电子邮件地址和简报ID作为url参数。但是,当我查看我订阅的列表中的示例时,许多都不包含可识别的地址,并且大多数似乎在参数中使用类似guids和/或散列值的内容。从那以后,我猜我应该散列或以其他方式编码一些信息,以防止恶意滥用取消订阅表格。
所以我的问题是关于最佳实践,而不是重新发明轮子。有没有一种标准的方法来处理这种功能?更具体地说,是否有理由不将收件人的电子邮件地址作为网址的一部分?这看起来很简单,让我觉得我忽视了什么。
答案 0 :(得分:27)
您可以像这样对URL进行编码:
http://yourserver.com/unsubscribe/<encoded-email>/<expiration>/<signature>
其中<signature>
类似于HMAC(secretkey, "<encoded-email>/<expiration>")
。编码电子邮件可以只是电子邮件的URL编码,也可以是电子邮件的实际加密版本(AES + CBC + Base64或类似版本)。使用完全加密似乎没什么用处 - 因为收到此邮件的人无论如何都有自己的电子邮件地址。
此签名方案的优点是不需要任何数据库存储,同时保持安全,防止恶意企图取消订阅某人。
或者(或除上述之外),您可以发送确认邮件以确认用户的意图。如果用户转发电子邮件,这可以避免问题。
答案 1 :(得分:3)
如果您的邮件列表软件使用旧式最佳做法,则应该有一个“取消订阅”电子邮件地址 - 从您要取消订阅的地址(可能带有固定的主题行)通过电子邮件发送到该地址通常可以解决问题(沿着发送确认电子邮件)。在这种情况下,添加格式正确的“mailto”链接应该可以解决问题。
答案 2 :(得分:2)
在URL中的查询中没有纯文本电子邮件地址的两个原因是您不希望恶意用户从您的邮件列表中取消订阅您的客户。
第二个可能只影响发送数百万封电子邮件的公司,是为了让垃圾邮件发送者更难以“嗅探”真正的电子邮件地址。
答案 3 :(得分:1)
在电子报中嵌入电子邮件地址是不安全的。不确定你的,但许多新闻通讯最终都在网上的一些档案中。有专门用于从邮件列表档案中获取地址的垃圾邮件机器人。
电子邮件是一种更安全的技术。设置邮件帐户以取消订阅并从邮件标题中获取电子邮件地址。如果你使用任何邮件列表软件,它应该已经处理过了。
答案 4 :(得分:0)
我在Web应用程序中使用了一种简单的方法,但我不确定它是否足够高效且足够安全,可用于其他Web应用程序。
在我的应用程序中,当用户点击取消订阅链接时,我将它们转发到我服务器上的一个页面,其中包含一个查询字符串,该字符串是用户电子邮件地址和我DB
中唯一ID的组合(均加密)优选地)。
然后在我的页面的页面加载功能中,首先我decrypt
Email address
,然后我检查我的数据库中是否存在电子邮件地址,然后如果答案是真的,我检查ID
和Email address
是否相关,最后根据其他标准删除用户。
我认为如果没有任何额外的数据输入DB
,它就可以完成这项任务。
现在,我正在寻找一种方法,以确定点击该链接的人是我发送电子邮件的第一手资料,还是已将电子邮件转发给他/她。因此除了真实用户之外,没有人可以(至少很容易)取消订阅他/她!
[在最后确定取消订阅流程之前询问安全问题是我到目前为止所考虑的一件事]
答案 5 :(得分:0)
我为每个电子邮件地址分配一个唯一的32个字符的标识符字符串(使用MySQL:MD5(UUID())
),并且仅在退订链接中提交该标识符。
答案 6 :(得分:-6)
我发送每封发送身份证的电子邮件,然后在点击取消订阅时查找电子邮件ID。
http://www.foo.com/unsubscribe.asp?ID=1234
然后取消订阅我发送的电子邮件地址1234。