3

私が作成しているログインシステムの一部として、各クライアントにちなんで名付けられた一意のセッション内で失敗したログイン試行を追跡します。

if($login_failed) {

            // update failed login attempts
            $session_name = 'failed_attempts'.$_SERVER['REMOTE_ADDR'];

            if(!isset($_SESSION[$session_name])) {
                $_SESSION[$session_name] = 1;               
            }
            else {
                $_SESSION[$session_name] += 1;  
            }

}

ご覧のとおり、各セッションの一意の名前を決定するために、文字列「failed_login_attempts」の最後にユーザーのIPアドレスを追加します。

ユーザーが5回失敗した試行に達した場合、それ以降の試行ごとにキャプチャを入力する必要があります。

多くのユーザーに同じIPアドレスが割り当てられているネットワークがあるのではないかと心配しています。その場合、1人のユーザーがログインに失敗すると、その1人のユーザーだけがキャプチャを表示する必要がありますが、すべてのユーザーにキャプチャが表示され始めます。

これは合理的ですか、それとも2人のユーザーが同じIPを持つことができる状況はありません。たとえば、最初の3オクテットは同じですが、最後の数は異なります。その場合、心配する必要はありません。

複数のユーザーが同じIPを共有する可能性がある場合、ログインしていないユーザーをセッションにリンクするセッション名の一意の識別子を決定するための良い方法は何ですか?

4

3 に答える 3

6

セッションは、その特定のブラウザでその特定のユーザーのCookieに関連付けられているため、すでに一意です。他のユーザーに波及することを心配する必要はありません。

セッションIDは、これらすべてを結び付けるものです。

舞台裏で実際に起こっていることは、PHPがサーバーに保存されているデータ構造に関連付けられた一意のID(セッションID)を使用してブラウザーにCookieを保存することです。そのIDを除いて、実際のセッションデータはサーバーを離れることはありません。これは実際にはファイルです。phpフォルダーをざっと見てみるとわかります。

于 2012-05-02T02:18:13.830 に答える
1

ほとんどの学校、家庭、およびオフィスのネットワークでは、ユーザーNAT内から、またはアウトバウンドファイアウォールを介してより広範なインターネットにアクセスするため、IPアドレスを共有します。uniqid()各障害に関連付ける一意の値を生成するために使用します。ただし、これは完全に必要というわけではありません。これは、session_id()ユーザーセッションごとに一意の値がすでに保持されているためです。

セッションの失敗を追跡するために本当に必要なのは、そのセッション内の変数をインクリメントすることだけです。

if (failed_login) {
  $_SESSION['failed_logins']++;
}

$threshold = 5;
if ($_SESSION['failed_logins'] >= $threshold) {
   // Do whatever is needed when too many failures occur
}

ただし、これによって、ユーザーがブラウザを再起動して新しいセッションを取得するのを防ぐことはできないことに注意してください。ユーザーエージェントをログに記録するなど、ジャンプするフープをさらに追加できますが、同じネットワーク上の他のユーザーとの潜在的な競合を引き起こす可能性があり、巧妙なエンドユーザーによってなりすまされたり変更されたりして制限を回避できます。

于 2012-05-02T02:18:41.650 に答える
0

より良い解決策は、ユーザーテーブルの列にフラグを立ててインクリメントし、5に達したときに、キャプチャコードをトリガーすることです。正常にログインしたら、値を0にリセットします。

于 2015-09-01T14:32:06.263 に答える