Email 为您的新闻稿实现取消订阅链接的最佳方式是什么?

Email 为您的新闻稿实现取消订阅链接的最佳方式是什么?,email,newsletter,unsubscribe,Email,Newsletter,Unsubscribe,我想我应该创建一个停用代码,将其与用户id一起放在“取消订阅”链接中。然后,当我的新闻稿的收件人单击该链接时,我可以查找他们的用户id并查看停用代码是否匹配 这听起来是最好的方式吗 还有哪些其他方法?从用户的角度来看,不需要用户输入要取消订阅的电子邮件地址。将所有信息嵌入链接(如您所描述的)的方法要好得多。您可以使用哈希算法来保护用户ID(这样就没有人可以用讨厌的循环注销所有数据库) 您将得到两个参数:userID和hash 优点是您不需要存储停用代码和用户ID之间的任何映射。从最终用户的角度来

我想我应该创建一个停用代码,将其与用户id一起放在“取消订阅”链接中。然后,当我的新闻稿的收件人单击该链接时,我可以查找他们的用户id并查看停用代码是否匹配

这听起来是最好的方式吗


还有哪些其他方法?

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

您可以使用哈希算法来保护用户ID(这样就没有人可以用讨厌的循环注销所有数据库)

您将得到两个参数:userID和hash


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

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

但是,使用散列(id+secret)是不安全的,因为聪明的攻击者可以非常快速地“暴力”秘密,然后通过简单地增加id来取消订阅数据库中的每个用户

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

例如,您的“取消订阅”链接如下所示:

http://mydomain.com/unsubscribe?email={$email}&hash={$hash}
用于生成$hash的服务器端函数在PHP中如下所示:

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

然后,要完成取消订阅,您将通过电子邮件查找用户,并进行验证


$\u GET['hash']==取消订阅hash($user\u id,$\u GET['email'])

让我直说吧。。。在本例中,userID参数将与hash参数一起散列。所以参数是userID和hash,然后hash(hashedUserID,hash)=userID…对吗?我想他指的是url=/unsub?userID=x&hash=$hash(x+secret),其中secret是你不能透露的东西。然后我必须在数据库中保留秘密,这基本上就是停用代码。那么优势是什么呢?不涉及数据库,因为您的所有应用程序只有一个秘密。这个秘密只会在你的代码中出现(一次)。我不会包含数据库中的用户ID,而只是使用电子邮件,因为这是电子邮件中已公开的信息。请参阅此处的副本: