1

ログイン試行回数を保存するためにセッションを使用しようとしています。ログイン試行の最大数に達すると、クライアントのIPアドレスをブラックリストテーブルに保存します。

私が考慮に入れているいくつかのこと、あなたは知っておく必要があるかもしれません:

  • session_regenerate_id();セッション値を設定した後に使用しています。
  • これは必要ではなく、2012年ではないため、セッション以外のCookieは使用していません:p
  • ユーザーのIPは、ブラックリストテーブルから彼の行を手動で削除するまでブラックリストに登録されます。
  • SESSION_MAX_ATTEMPTS定義された定数であり、5に設定されます。
  • このindex.php?module=login&task=blacklistページは、ブラックリストに登録されているというメッセージをユーザーに表示しているだけです。このページには機能がありません。
  • カスタムビルドのphpフレームワークを使用しているので、メソッドと呼ばれるOOPを簡略化されたphpコードに変換する必要がありました。

ログインクエリが実行される前に、次の関数が呼び出されます。

private function preventAttack()
{
    $blocked = getData("SELECT count(*) as blocked FROM blacklist WHERE ip = @Value0;", Array( $_SERVER['REMOTE_ADDR'] ));
    if($blocked[0]["blocked"] == "1")
    {
        redirect("index.php?module=login&task=blacklist");
    }
    $old = (int)$this->session->get("login_attempts");
    if(!empty($old))
    {           
        if($old > SESSION_MAX_ATTEMPTS)
        {
            setData("INSERT INTO blacklist SET ip = @Value0;", Array( $_SERVER['REMOTE_ADDR'] ));
            redirect("index.php?module=login&task=blacklist");
        }
        else
        {
            $old++;
            $this->session->set("login_attempts",$old);
        }
    }
    else
    {
        $this->session->set("login_attempts", 0);
    }
}

最初のifステートメントは両方のクエリを含めて機能しますが、試行回数を保存するための最良の方法と、それを++するための最良の方法は何ですか?多分あなたたちは私を正しい方向に向けることができます。

私のコードについて質問がある場合は、コメントを追加してください。フレームワークからのものなので、少し読めないことはわかっています。投稿する前に少し翻訳しました。

4

2 に答える 2

4

失敗した試行の数を、セッションではなくデータベースに保存します。注意:おそらく、各障害をタイムスタンプとともに独自のレコードに保持する必要があります(そして、しきい値より古いものはすべて無視/削除します)。

ちなみに、decezeのコメントに応えて:

このアプローチの大きな欠陥:セッションは、Cookieを送信するクライアントに依存します。実際の攻撃者は、Cookieを送り返すことはありません。ziiiingあなたはすべてのためにIPで行かなければならないでしょう。

これに対する解決策は、他の場所で設定された有効なセッションCookieが付属していないログイン試行を受け入れないことです。

于 2012-07-16T12:33:32.093 に答える
0

たくさんの人に感謝します、私はあなたのコメントから多くを学びました。同じ問題を抱えているユーザーのために、私が学んだことと、その知識をどのように使用しているかを説明します。

私がこれまでに学んだこと:

  1. 実際の攻撃者は、単にCookieを送り返すことはありません。したがって、この場合、Cookieまたはセッションを使用しても意味がありません。
  2. 攻撃者をブラックリストに登録したい場合は、これを自動的に行うファイアウォールを使用できます。スクリプトからこれを行うのは意味がありません。セッションは簡単に回避され、IPアドレスを確認すると、同じ外部IP上のオフィスや学校全体をブロックする可能性があります。
  3. 何をするにしても:ログイン試行データはサーバーのデータベース/フラットファイルなどにのみ保存します。ユーザーまたは攻撃者は、このデータをそれほど簡単に編集することはできません。
  4. また、パフォーマンスのためにWebサーバーにデータを保存する場合は、DBではなくファイルに保存してください。

何か忘れた場合はコメントしてください。この投稿を編集します。

私はホスティングプロバイダーに確認しましたが、彼らはすでに上記のファイアウォールのようなソリューションを使用してこれらの攻撃者の多くをブロックしています。だから私は私のスクリプトでもこれをやろうとするのをやめます。

私のスクリプトは現在修正されており、パスワードを推測しているユーザーとnoobハッカーのみをブラックリストに登録しています。

private function preventAttack()
{
    $blocked = getData("SELECT count(*) as blocked FROM blacklist WHERE ip = @Value0;", Array( $_SERVER['REMOTE_ADDR'] ));
    if($blocked[0]["blocked"] == "1")
    {
        redirect("index.php?module=login&task=blacklist");
    }
    $old = (int)$this->session->get("login_attempts");
    if($old > 0)
    {           
        if(($old + 1) >= SESSION_MAX_ATTEMPTS)
        {
            setData("INSERT INTO blacklist SET ip = @Value0;", Array( $_SERVER['REMOTE_ADDR'] ));
            $this->session->set("login_attempts", 0);
            redirect("index.php?module=login&task=blacklist");
        }
        else
        {
            $old++;
            $this->session->set("login_attempts",$old);
        }
    }
    else
    {
        $this->session->set("login_attempts", 1);
    }
}

このプラットフォームが何人のユーザーを獲得するのかよくわからず、mysqlサーバーの負荷が高くなる可能性がないため、ログイン試行をデータベースに保存しないことにしました。多分将来、誰が知っている。

于 2012-07-16T12:45:17.187 に答える