セキュリティ-PHPログイン試行機能
ログインフォームで作業しているので、試行を3回に制限してから、フォームの送信を10分間ブロックする必要があります。次のコードは正しく機能していません。失敗した試行の後に送信をブロックする方法を知る必要があります。ありがとう。
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>");
}
}
}
答え :
解決策:
ここでの問題は、 autoDefender
を呼び出すたびにローカル変数$logins
が呼び出されることです。 0
にリセットされます。そのため、実際に行われた試行回数の状態は、 autoDefender
の複数の呼び出しにわたって維持されません。
この情報を永続的にどこかに保存する必要があります。あなたの場合、複数のリクエストにまたがっています。
他のユーザーをロックアウトできるため、これはサービス拒否攻撃の攻撃対象領域にもなることに注意してください。したがって、失敗した試みの原因を誰に帰するかをよく考えてください。ユーザーごとに行うと、攻撃者はすべてのユーザーに対して一括攻撃を行うときに多くのユーザーをロックアウトする可能性があります。リモートクライアント(IPアドレスなど)ごとに実行すると、同じシステム(会社や大学のネットワークなど)を使用している他の無実のユーザーをロックアウトする可能性があります。セッションごとに実行すると、攻撃者は発行されたセッションIDをドロップする可能性があります。
答え :
解決策:
コードは最初から毎回実行されるため、$ loginsが0で初期化されるたびに。したがって、変数を0ではなく、数値の値から初期化する必要があります。このIPからの以前のログイン試行の数(データベースのどこかに保存する必要があります)
$ loginsをCookie(またはセッション)に保存するための提案を聞かないでください。それは攻撃者によって単に消去される可能性があります(そしてそれはそうなるでしょう)。代わりに、サーバー側のどこかに保存してください:sql database、memcached、berkley db、...多くのオプションがあります。
最後に、あなたは基本的な(Web、そしておそらくWebだけでなく)プログラミングの概念を誤解しているようです。そのため、メンターにコードを再確認するか、stackexchangeネットワークのコードレビューサイトを使用することをお勧めします。特に、非常に重要なセキュリティ関連のコードを作成する場合。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。