私はあなたの質問とコメントを理解しているので、あなたの要件は
- ユーザーがリンクを1回クリックするだけで登録を解除できるようにする
- データベースに個々のトークンを保存しないでください
サーバー上で、httpGETリクエストによってトリガーされるアクションが発生します。
http://youremailsystem.tl/unsubscribe&user=12&contact=34&list=56
あなたの提案1)、暗号化はプライバシーの追加の利点を追加します(URLはパラメーターが実行されるアクションを提供しません)、2)はより簡単なアプローチです。
URLパラメータに署名するにはMAC関数を使用する必要があります。入力は、署名するパラメーターと秘密鍵であり、サーバーを離れることはありません。
$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を持つ新しいユーザーの登録をかなり後で解除できるようになります。