为您的简报实施取消订阅链接的最佳方式是什么?

时间:2009-05-12 17:20:55

标签: email newsletter unsubscribe

我在想我在取消订阅链接中创建一个停用代码及其用户ID。然后,当我的简报的收件人点击该链接时,我可以查找他们的用户ID并查看停用代码是否匹配。

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

还有其他什么方法?

3 个答案:

答案 0 :(得分:9)

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

然而,使用hash(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);
}
?>

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

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:4)

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