2011-07-29 13 views
1

私はログインフォームに取り組んでいます。私は試行回数を3回に制限し、10分間フォーム送信をブロックする必要があります。次のコードは正しく動作していないため、失敗した試行後に送信をブロックする方法を知る必要があります。ありがとう。Security-PHPログイン試行機能

function autoDefender($attempts,$username,$pass) 
    { 
    $logins=0; 
    $logins++; 
    $ats = $attempts-$logins; 
     if (isset($_POST['password']) && isset($_POST['userName'])) 
     { 
      if($_POST['password']!=$pass && $_POST['userName']!=$username) 
       { 
        if($logins == $attempts) 
         { 
         echo ("<div class='errmg'>Acess denied for 1 minute</div>"); 
         } 
        echo ("<div class='errmg'>Error: 
        invalid username or pass; <span class='atmpts'>$ats</span> attempts left</div>"); 
       } 
     } 
    } 
+0

保存された値を持つクッキーを作成し、10分後に期限切れになるように設定する方法について説明します。 –

+1

それは良い質問です!しかし、まず 'logins = 0'と' logins ++ 'と言うと、' logins = 1'と言うこともできます。これは0に設定してからインクリメントするからです。したがって、常に1になります:) – Milaan

+2

ログイン試行は、データベースなどのどこかに保存する必要があります。また、新しい試みごとに、限界に達するまで+1してから時間を節約し、ユーザーに待たせます。 – ComFreek

答えて

4

ここでの問題は、autoDefenderの各呼び出しでローカル変数$logins0にリセットされることです。実際に何回試みられたかの状態は、autoDefenderの複数回の呼び出しでは維持されません。

この情報を永続的に保存する必要があります。あなたのケースでは、複数の要求にもかかわらず。

これは、他のユーザーをロックアウトする可能性があるため、サービス拒否攻撃の攻撃対象となることにも注意してください。だから失敗した試行の属性を2度考えなければなりません。ユーザーごとに行う場合、攻撃者はすべてのユーザーに対して一括攻撃を行うときに多くのユーザーをロックアウトする可能性があります。リモートクライアント(IPアドレスなど)ごとに行う場合、同じシステム(たとえば、会社ネットワークまたは大学ネットワーク)を使用している他の無実のユーザーをロックアウトする可能性があります。セッションごとに行う場合、攻撃者は発行されたセッションIDをドロップするだけです。

1
あなたのコードは非常にたびに$ログインがそれで、あなたは0でなく、あなたの変数を初期化する必要が0で初期化、最初から毎回実行されているので

が、前回のログイン試行回数の値からからこのip(どこかに、つまりデータベースに格納する必要があります)。

クッキー(またはセッション)に$ログインを保存するための提案を聞かないでください。それは攻撃者が単純に消去することができます(それは可能です)。代わりに、サーバー側のどこかに格納してください:sql database、memcached、berkley db、...多くのオプションがあります。

最後に、私は基本的な(ウェブだけでなく、多分ウェブだけでなく)プログラミングの概念を誤解しているようですので、あなたの指導者とコードを再確認するか、stackexchangeネットワークのコードレビューサイトを使用することをお勧めします。特に重要なセキュリティ関連のコードを書くとき。

+0

xmlまたはjsonどこですか? XMLとjsonは単なるフォーマットであり、データベースやストレージエンジンではありません。テキストファイルから読み込み/ダンプすることについて話しているのであれば、あなた自身が並行処理の問題に注意する必要がありますが、単純で高速のberkleydbがそれを行います。 – rvs

+0

私は$ログインが0で初期化されていることを知っています。誰かが変数を初期化して適切にインクリメントする方法を教えてくれるので、書きました。 – George

+0

したがって、変数を0ではなく、このIPからの以前のログイン試行回数の値から初期化する必要があります。 – rvs

関連する問題