ログインの時間遅延がブルートフォーシングを停止するために、良いアイデアを停止しますか?
-
26-10-2019 - |
質問
失敗したログインの試みごとにログを記録するようにDBを設定しました。失敗した試みの数に0.05秒か何かを掛けると思いました。何かのようなもの:
time_nanosleep(0, (50000000 * $failed_attempts ) );
ハッカーがパスワードを推測するために使用するより多くの試み、毎回チェックするのにもっと時間がかかります。 100個の継代をチェックした後、彼は各試行の間に5秒待つ必要があります。
これはブルートファーピングを停止するのに良い方法ですか? IPでユーザーを識別します。したがって、複数のプロキシサーバーなどを使用してアプリケーションをBruteforceすることができると思いますが、それに加えて、良い考えだと思います。皆さんはどう思いますか?
解決
どんなものはどうですか:
time_nanosleep(0, (10000000000 * (log($failed_attempts)^10)) );
これにより、指数関数的に増加する試みウィンドウが得られます。
他のヒント
私が見る最初の問題は、応答の間に遅延があるかどうかは気にしないボットを扱っているということです。これを制限するために何かをしない限り、潜在的に非常に長い遅延でシステムリソースを使い果たしています。 5回の試行に失敗した後、IPを禁止するだけです。実際のユーザーを禁止することを心配している場合は、一時的な禁止になる可能性があります。
IPで再試行を制限し、Captchaを使用します。サーバーをオーバーロードしないでください、キスを考えてください。
CPUサイクルを使用しているため、Sleep()を使用しないようにしてください。10,000のIPアドレスからブルートフォース攻撃がある場合は、10,000のSleep()Child ProcessまたはThreadsをフォークします。これにより、サーバーに負荷がかかります。
代わりに、PHPを使用してIPアドレスをブロックしてみてください。このようなもの。
function block_ip($ip) {
$deny = array("$ip");
if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {
header("HTTP/1.1 403 Forbidden");
exit();
}
}
それはブルートファーシングに対するあなたの戦略全体であってはなりませんが、それはその戦略にとって優れたコンポーネントであり、IMOはほとんど常に使用する必要があります。
直線的にではなく、その時間を指数関数的に増やすことをお勧めします。または、5回の試行に失敗した後1時間拒否します。
私はこれがどこかで行われるのを見たことを知っていますが、どこで忘れてしまいます。私が見た例では、彼らは失敗した試みのたびに時間遅延を2倍にしました。たとえば、0.1秒から始めた場合、パスワードを1、2回誤って誤って誤っている可能性がある通常のユーザーは、0.4秒の遅延まで上がります。彼らは気づかない。しかし、ブルートフォースを試してみる人は、数分または数時間ですぐに遅延を獲得することを攻撃します。
Webアプリの場合、自分自身に対するサービス拒否攻撃を開始する問題があるかもしれません。それはすべて、システムが時間遅延をどのように処理するかに依存します。
ボットは、それが指数関数的であろうと対数であろうと何かであろうと、あなたの遅延を本当に気にしません。使用する遅延は、ポーリングによって克服できます。だから、遅延を考えないでください。試みの数を制限することを考えて、Google Recaptchaを使用してください。官民のキー暗号化を使用します。ほとんどのボットを排除するために機能し、割れにくい。