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

Ton*_*ony 9 email newsletter unsubscribe

我在想我在unsubscribe链接中创建一个停用代码及其用户ID.然后,当我的时事通讯的收件人点击该链接时,我可以查找他们的用户ID并查看停用代码是否匹配.

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

还有什么其他方法?

jch*_*ook 10

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

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

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

因此,例如,您的取消订阅链接将如下所示:

http://mydomain.com/unsubscribe?email={$email}&hash={$hash}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Mat*_*euP 9

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

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

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

  • 我不会包含数据库中的用户 ID,而是仅使用电子邮件,因为这是电子邮件中已经公开的信息。请参阅此处的重复内容:http://stackoverflow.com/questions/1240915/how-to-add-one-click-unsubscribe-functionity-to-email-newletters (3认同)
  • 我认为他的意思是 url = /unsub?userID=x&amp;hash=$hash(x + secret),其中机密是您不透露的内容。 (2认同)
  • 不涉及数据库,因为您的所有应用程序只有一个秘密.秘密只会出现在您的代码中(一次). (2认同)