11

ユーザー ID と一緒に登録解除リンクに入れる無効化コードを作成しようと考えています。次に、ニュースレターの受信者がリンクをクリックすると、ユーザー ID を調べて、無効化コードが一致するかどうかを確認できます。

これが最善の方法のように聞こえますか?

他にどのような方法がありますか?

4

3 に答える 3

13

エンドユーザーの観点からすると、シングルクリックの購読解除は優れています。

ただし、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'])

于 2012-06-27T21:04:32.557 に答える
11

ハッシュアルゴリズムを使用してユーザーIDを保護することができます(厄介なループですべてのDBを誰も登録解除できないようにするため)。

userID と hash の 2 つのパラメーターが作成されます。

利点は、無効化コードとユーザー ID の間のマッピングを保存する必要がないことです。

于 2009-05-12T17:27:09.307 に答える
4

ユーザーの観点からは、ユーザーが購読を解除するために電子メール アドレスを入力する必要はありません。リンクにすべての情報が埋め込まれているアプローチ(説明など)の方がはるかに優れています。

于 2009-05-12T17:22:38.503 に答える