3

我已经阅读了许多关于这个主题的 SO 帖子,但他们似乎不以为然,认为它并不重要,所以如果我给你一个现实世界的例子,这可能会影响答案。

一个管理联系人列表和发送电子邮件的系统,但允许收件人使用唯一的 url取消订阅。

由于这是一个公共页面,因此某人只需增加 id 并取消订阅其他用户将是微不足道的。

我不想为用户/联系人/列表的每个组合添加一个必须存储在数据库中的唯一哈希。

最好的方法是什么?以下其中一项是否可以接受?

a)加密所有ID并解密服务器端

b) 根据 3 个 ID 和盐在 url 中包含一个哈希,然后在服务器端确认它

4

5 回答 5

3

据我了解您的问题和评论,您的要求是

  • 允许用户通过单击链接取消订阅 1
  • 不要在数据库中存储任何单独的令牌

您将在服务器上执行由 http GET 请求触发的操作,例如

http://youremailsystem.tl/unsubscribe&user=12&contact=34&list=56

虽然您的建议 1)加密增加了隐私的额外好处(URL 不会泄露执行哪些参数的操作),但数字 2)是更简单的方法。

应该使用 MAC 函数来签署您的 URL 参数。输入将是您要签名的参数以及永远不会离开您的服务器的密钥。

$signature = hash_hmac('sha256', $url, $mysecretkey);
$url = $url . '&signature=' . $signature;

这使得签名成为您电子邮件中取消订阅 URL 的一部分。

http://youremailsystem.tl/unsubscribe&user=12&contact=34&list=56&signature=b1812e463a7

每当收到 GET 请求时,您都可以验证参数是否未更改。

粗略的代码:

// extract sent signature from url:
$sent_signature = //substr($sent_url ...

// strip signature from URL:
$sent_url = //substr($sent_url ...

// repeat hashing:
$correct_signature = $signature = hash_hmac('sha256', $sent_url, $mysecretkey);

if( $sent_signature == $correct_signature ) {
    // do the unsubscribe
}

请注意,任何 URL 都可以重复调用,因此请确保您永远不会重复使用您的任何 ID,否则您将允许前用户在很久以后取消订阅现在拥有其 ID 的新用户。

于 2012-08-16T10:08:34.260 回答
2

我作为一个花了几年时间编写时事通讯软件 (SAAS) 的人的观点。

为每个用户\加入者\成员创建一个散列,并将其与其他详细信息一起存储。在取消订阅的链接中使用它。

我的链接中总是有 2 个哈希值,一个是发送哈希值的时事通讯,然后您可以跟踪他们取消订阅的哈希值,以及每个个人的哈希值。

如果您确实希望按照 Thilo 的建议在一定时间后使取消订阅链接到期,您可以使用由时事通讯发送哈希确定的时事通讯发送日期,但您需要给他们另一种方法,如果链接被认为是旧的。如另一封电子邮件

强制性的一段代码。

$hash = md5(uniqid(true));

存储在具有唯一索引的 db 字段中。如果您愿意,您可以将电子邮件地址添加到其中,但 uniqid() 被设计为独一无二的。

于 2012-08-16T09:47:31.597 回答
1

为什么不愿意为每个用户创建一个唯一的令牌?您不必为您描述的每个组合(用户/联系人/列表)创建它,而只需为您与电子邮件地址关联的用户创建它。

然后为每个操作使用该单个标记。并在使用后进行更改。刚刚生成了 20 个随机数的东西。它既简单又安全。

于 2012-08-16T09:30:06.400 回答
0

我使用过的所有邮件列表都向我发送了一封确认邮件,用于取消订阅,其中可能包含一个随机且唯一的令牌,该令牌将在几个小时后过期。

我不想为用户/联系人/列表的每个组合添加一个必须存储在数据库中的唯一哈希。

您不必提前创建它们或无限期地存储它们。您可以在收到取消订阅请求时创建随机令牌,并在完成或过期时将其删除。

于 2012-08-16T09:28:04.780 回答
0

在每个用户的哈希中使用电子邮件地址和用户 ID(对于列表中可能的重复地址)。将哈希与地址一起存储在数据库中。

这样,如果您不知道其他用户的电子邮件,就很难重现散列。

于 2012-08-16T09:31:24.747 回答