11

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

这听起来像是最好的方法吗?

还有哪些方法?

4

3 回答 3

13

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

但是,使用 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^ca{19Q/5u';
    return sha1($id . $email . $hashSecret);
}
?>

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

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

于 2012-06-27T21:04:32.557 回答
11

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

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

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

于 2009-05-12T17:27:09.307 回答
4

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

于 2009-05-12T17:22:38.503 回答