据我了解您的问题和评论,您的要求是
- 允许用户通过单击链接取消订阅 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 的新用户。