ユーザー ID と一緒に登録解除リンクに入れる無効化コードを作成しようと考えています。次に、ニュースレターの受信者がリンクをクリックすると、ユーザー ID を調べて、無効化コードが一致するかどうかを確認できます。
これが最善の方法のように聞こえますか?
他にどのような方法がありますか?
ユーザー ID と一緒に登録解除リンクに入れる無効化コードを作成しようと考えています。次に、ニュースレターの受信者がリンクをクリックすると、ユーザー ID を調べて、無効化コードが一致するかどうかを確認できます。
これが最善の方法のように聞こえますか?
他にどのような方法がありますか?
エンドユーザーの観点からすると、シングルクリックの購読解除は優れています。
ただし、hash(id + secret) の使用は安全ではありません。これは、巧妙な攻撃者が非常に迅速にシークレットを「ブルート フォース」し、ID をインクリメントするだけで DB 内のすべてのユーザーの登録を解除できるためです。
サーバー上で 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'])
ハッシュアルゴリズムを使用してユーザーIDを保護することができます(厄介なループですべてのDBを誰も登録解除できないようにするため)。
userID と hash の 2 つのパラメーターが作成されます。
利点は、無効化コードとユーザー ID の間のマッピングを保存する必要がないことです。
ユーザーの観点からは、ユーザーが購読を解除するために電子メール アドレスを入力する必要はありません。リンクにすべての情報が埋め込まれているアプローチ(説明など)の方がはるかに優れています。