为您的时事通讯实施退订链接的最佳方式是啥?

Posted

技术标签:

【中文标题】为您的时事通讯实施退订链接的最佳方式是啥?【英文标题】:What is the best way to implement an unsubscribe link for your newsletter?为您的时事通讯实施退订链接的最佳方式是什么? 【发布时间】:2010-10-25 15:06:21 【问题描述】:

我正在考虑创建一个停用代码,将其与他们的用户 ID 一起放在取消订阅链接中。然后,当我的时事通讯的收件人单击该链接时,我可以查看他们的用户 ID 并查看停用代码是否匹配。

这听起来是不是最好的方法?

还有哪些其他方法?

【问题讨论】:

【参考方案1】:

从最终用户的角度来看,单击取消订阅非常棒。

但是,使用 hash(id + secret) 是不安全的,因为聪明的攻击者可以非常快速地“暴力破解”秘密,然后只需增加 ID 即可取消订阅数据库中的每个用户。

在服务器上保持“半机密”ID 并在取消订阅时使用电子邮件地址查找用户会更加安全。这样,成功的取消订阅需要将电子邮件地址与正确的 ID 配对。您可以通过为每个用户保存一个真正的密钥并使用它而不是 ID 来使这一点更加安全。如果电子邮件 + ID 对已发布,这一点尤其必要。

因此,例如,您的退订链接将如下所示:

http://mydomain.com/unsubscribe?email=$email&hash=$hash

php 中生成 $hash 的服务器端函数如下所示:

<?php
function unsubscribeHash($id, $email) 
    $hashSecret = 'Fz!Fx~36N66>io3B-vlPDshdRxos8JjCd4+Ld-s2^ca19Q/5u';
    return sha1($id . $email . $hashSecret);

?>

然后,要完成退订,您将通过电子邮件查找用户,并验证

$_GET['hash'] == unsubscribeHash($user_id, $_GET['email'])

【讨论】:

【参考方案2】:

您可以只使用散列算法来保护用户 ID(这样就没有人可以通过讨厌的循环取消注册您的所有数据库)。

您最终会得到两个参数:userID 和 hash。

优点是您不需要存储停用代码和用户 ID 之间的任何映射。

【讨论】:

让我直截了当地说...在这种情况下,用户 ID 参数将使用散列参数进行散列。所以参数是 userID 和 hash,然后 hash(hashedUserID,hash) = userID ....correct? 我认为他的意思是 url = /unsub?userID=x&hash=$hash(x + secret),其中 secret 是你不透露的东西。 然后我必须将秘密保存在数据库中,这基本上就是停用代码。那么有什么优势呢? 不涉及数据库,因为您的所有应用程序只有一个密钥。密码只会在您的代码中出现(一次)。 我不会包含数据库中的用户 ID,而是只使用电子邮件,因为这是电子邮件中已经公开的信息。在此处查看副本:***.com/questions/1240915/…【参考方案3】:

从用户的角度来看,不要求用户输入电子邮件地址来取消订阅。将所有信息嵌入链接(如您所描述的)的方法要好得多。

【讨论】:

以上是关于为您的时事通讯实施退订链接的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

需要对时事通讯实施的建议

实施 SSO 的最佳方式是啥?

实施贝宝信用的最佳方式是啥

DB Audit Trail 的最佳实施是啥? [关闭]

您将如何在您喜欢的数据库范式中为您的模型实施修订控制系统?

实施 Pipeline 以确保训练和测试虚拟变量相同的最佳方法是啥?