3

私はこのテーマに関する多くのSO投稿を読みましたが、重要ではないとして肩をすくめているようです.

連絡先リストを管理し、電子メールを送信するシステムですが、受信者は一意の URL を使用して購読を解除できます。

これは公開ページであるため、誰かが ID を増やして他のユーザーの登録を解除するのは簡単です。

ユーザー/連絡先/リストの組み合わせごとにデータベースに保存する必要がある一意のハッシュを追加したくありません。

これに対する最善のアプローチは何ですか?次のいずれかは許容されますか?

a) すべての ID を暗号化し、サーバー側で復号化する

b) 3 つの ID とソルトに基づいて URL にハッシュを含め、サーバー側で確認する

4

5 に答える 5

3

私はあなたの質問とコメントを理解しているので、あなたの要件は

  • ユーザーがリンクを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を持つ新しいユーザーの登録をかなり後で解除できるようになります。

于 2012-08-16T10:08:34.260 に答える
2

ニュースレター ソフトウェア (SAAS) の作成に数年を費やした者としての私の見解です。

各 user\joiner\member sans のハッシュを作成し、それを他の詳細と共に保存します。購読解除のリンクでそれを使用します。

私のリンクには常に 2 つのハッシュがありました。1 つはニュースレター送信ハッシュでした。その後、どのハッシュから購読を解除したか、および個人ごとのハッシュを追跡できます。

Thilo が提案するように、一定の時間が経過した後にサブスクライブ解除リンクを期限切れにしたい場合は、ニュースレター送信ハッシュによって決定されるニュースレターが送信された日付を使用できますが、別の方法を提供することをお勧めします。リンクが古いと判断された場合。別のメールなど

必須のコード。

$hash = md5(uniqid(true));

一意のインデックスを持つ db フィールドに格納します。必要に応じて、メールアドレスをミックスに追加することもできますが、uniqid() は、まあ、一意になるように設計されています。

于 2012-08-16T09:47:31.597 に答える
1

ユーザーごとに一意のトークンを作成することに躊躇するのはなぜですか? 説明する組み合わせ (ユーザー/連絡先/リスト) ごとに作成する必要はありませんが、メールアドレスに関連付けるユーザーに対してのみ作成する必要があります。

次に、アクションごとにその 1 つのトークンを使用します。また、使用後は交換してください。何かの乱数を 20 個生成しました。簡単で安全です。

于 2012-08-16T09:30:06.400 に答える
0

私が使用したすべてのメーリング リストは、数時間後に有効期限が切れると思われるランダムで一意のトークンを含む、登録解除の確認メールを送信してくれました。

ユーザー/連絡先/リストの組み合わせごとにデータベースに保存する必要がある一意のハッシュを追加したくありません。

事前に作成したり、無期限に保存したりする必要はありません。登録解除リクエストを受け取ったときにランダムなトークンを作成し、完了または期限切れになったら削除できます。

于 2012-08-16T09:28:04.780 に答える
0

各ユーザーのハッシュで、メール アドレスとユーザー ID を使用します (リスト内のアドレスが重複している可能性があるため)。アドレスとともにハッシュをデータベースに保存します。

この方法では、他のユーザーの電子メールを知らない場合、ハッシュを再現するのは困難です。

于 2012-08-16T09:31:24.747 に答える