0

プロセスは非常に簡単です。

ユーザーが登録用のフィールドに入力した後、mysqlデータベーステーブルの「activation_key」という列はランダムに生成された長い文字列を保持し、別の列activatedは値0を保持します。

アクティベーションメールは、列のランダムキー値を含むアクティベーションリンクとともに登録者のメールに送信されactivation_keyます。リンクをクリックすると、URLはデータベースで長い文字activation_key'列を含む列を検索します。そのような値がある場合、「activation_key」は空白に設定され、「activate」列は1に設定されます。.

アクティベーションキー文字列が生成されると、生成されているキーがすでに存在するかどうかが検索され、存在する場合は、別のランダムな値が生成されて一意のキーが取得されます。

したがって、少数のメンバーになる予定のメンバーが登録を保留している場合、同様の文字列検索が実際にテーブル内の行に対して実行されます。

この時点まで、すべてが大丈夫です。

ただし、新しいメンバーが、登録を完了した別のメンバー用に以前に生成されたアクティベーション文字列を取得すると考えてください。

万が一、登録済みのメンバーが古いメールのアクティベーションリンクをクリックすると、実際に登録を完了していなくても、他の新しいメンバーは登録を完了します。

そのため、「activation_key」テーブルを空白に設定しないことにしました。そのため、既存または将来のすべてのメンバーに対して同様の文字列検索が実行されました。

それは結構です。ただし、ユーザー数が多い場合、つまり1 lacを超える場合は、アクティベーションメールを送信するための登録プロセスに時間がかかります。

1)データベース探索コストを最小限に抑える他の方法はありますか?

2)この場合、Facebookのようなメガサイトはどのようなポリシーを取りますか?

4

3 に答える 3

2

同じアクティベーション キーが 2 回生成される可能性は非常に低いはずです。しかし、解決策は、電子メールでアクティベーション キーとユーザー名を送信し、両方に対してデータベースをチェックすることです。

そのため、アクティベーション電子メールが送信されると、次へのリンクが含まれています。

/activate.php?activation_key=key&username=name

の代わりにactivation_key。そして、キーが本物かどうかを確認するときは、

WHERE activation_key = key AND username = name;

mysqlクエリで。

このようにして、ユーザーを適切にアクティブ化するためにユーザー名とキーの両方が必要になるように、システムを保護します。

安全性を高めるためUNIQUEに、列にインデックスを作成できactivation_keyます。スクリプトが既存のキーを使用して生成されたキーをユーザーの行に追加しようとすると、列が一意に設定されているため、クエリの実行は失敗します。次に、スクリプトを変更して、キーがデータベースに正常に格納されるまでキーの生成を試みる必要があります。無限ループにならないようにしてください。

無限ループ保護

$count = 0;
while ( $errno === 0 )
{
    // mySQL query here
    $errno = mysql_errno();

    $count++;

    if ( $count >= 5 )
            $errno = -1;
}

if ( $errno === -1 )
    echo "Sorry, the script was unable to generate the token for your activation.";

このサイクルは、クエリがエラーなしで実行されるまで、そこに配置されたクエリ (データベースにアクティベーション トークンを追加します) を実行します。実行ごと$countに増加し、制限 (例では 5) に達すると、ループを強制的に終了し ( $errno0 以外の実際の mySQL エラー値ではない値に設定)、その後ユーザーにエラー メッセージを表示します。 .

于 2012-06-02T12:27:43.917 に答える
0

アクティベーションリンクにユーザーIDと、場合によっては電子メールアドレスまたはユーザー名を含めます。考えられる利点:

  • ユーザーIDで整数検索を行うことができます
  • 重複するアクティベーションリンクについて心配する必要はありません
  • とにかく検索するつもりはないので、activation_keyフィールドにインデックスを付ける必要はありません。
  • 電子メール(またはユーザー名)を含めると、activation_keyの重複を持つユーザーIDをアクティブ化するために、誰もすべてのユーザーIDを「試す」ことができなくなります。
  • すべてのユーザーをアクティブ化するためにactivation_keysをブルートフォースすることは、非常に困難または不可能です。
  • Activation_keyでのデータの競合について心配する必要はありません。

重要:電子メールアドレスと短いactivation_keyだけを使用しないでください。特定の電子メールアドレスのアクティベーションキーを総当たり攻撃することはほぼ不可能であることを確認してください。

于 2012-06-02T12:31:30.473 に答える
0

新しく登録され、アクティブ化されていないアカウントのデータを別のテーブルに保存します。

非アクティブなユーザーに関する基本的な情報以上のものはおそらく必要ないので、プロファイル設定などの不要なデータを除外することができます。

アクティベーションキーが送信されたら、このテーブルで対応するキーのエントリを確認してください。見つかった場合は、日付を実際のユーザーテーブルに転送し、アクティブ化を待機しているユーザーのテーブルからエントリを削除します。

このようにして、次のことができます。a)アクティブ化されたユーザーがキーを必要としなくなったため、スペースを節約できます。b)アクティブ化されていないユーザーの概要をすばやく把握できます。

また、これをcron削除と組み合わせて、私の意見では3日間ほどアクティブ化されていないユーザーを削除する必要があります;-)

于 2012-06-02T12:19:29.813 に答える