重複の可能性:
PHPスクリプトがフラッディングするのを防ぎます
私の特定の「友達」は、更新キーを押したままにして、私のサイトをいじり続けています。これにより、コンテンツのページビューが非現実的に増加し、PHPの実行が停止するポイントにサーバーの負荷が追加されます。
PHPまたはJavaScriptを使用して、このような激しい更新(そのうちの1つは1時間半で3万件のリクエストを受け取った)を防ぐ方法があるかどうかを期待していましたか?
重複の可能性:
PHPスクリプトがフラッディングするのを防ぎます
私の特定の「友達」は、更新キーを押したままにして、私のサイトをいじり続けています。これにより、コンテンツのページビューが非現実的に増加し、PHPの実行が停止するポイントにサーバーの負荷が追加されます。
PHPまたはJavaScriptを使用して、このような激しい更新(そのうちの1つは1時間半で3万件のリクエストを受け取った)を防ぐ方法があるかどうかを期待していましたか?
ユーザーが特定のIPアドレスから行っているリクエストの数を常にカウントし、特定の制限に達した後は、未承認以外のものを返すのをやめることができます。
これは非常に単純な解決策ですが、おそらくその仕事をするでしょう。リクエスト/時間間隔で、または2分程度で100ページ以下のリクエストのようにそれを切り取ることができます。次に、IPを禁止するか、指定された期間エラーコードを返すことができます。その指定された時間は、5時間のようにハードコーディングされたものである場合もあれば、要求/時間間隔が有機的に減少するのを待つ場合もあります。
function isIpBlocked($ip)
{
//do mysql query to check if column is true
}
function shouldIpBeBlocked($ip)
{
//do mysql query to check if number of request over a certain interval is too high
}
if(isIpBlocked($ip))
{
header('HTTP/1.0 401 Unauthorized');
}
else
{
if(shouldUserBeBlocked($ip))
{
//do sql update/insert to indicate user is blocked in ip_block table or something
header('HTTP/1.0 401 Unauthorized');
}
else
{
//update number of requests from this ip address INSERT INTO ip_history (ip, ...) VALUE (:ip, ....);
//do your web site code
//maybe do a mysql query to clean out ip_history table for requests that happened a long time ago and check to see if you should unban people
}
}
そのコードをサイトのすべてのページに配置すると、ユーザーが事前に定義されたセキュリティルールに違反していないことが保証されます。
これには、 fail2banなどのツールを使用します。
たとえば、特定の時間内に同じ URL に対してあまりにも多くのリクエストを行う場合に、リクエスタの IP アドレスをブロックするルールを作成できます。また、ブロックされる期間を構成できます。
この方法の利点は、ネットワーク レベルで既にブロックが行われているため、サーバーの負荷が軽減されることです。
単一の IP などからの接続試行の制限については、apache/nginx のマニュアルをお読みください。
いくつかの読み取り:
https://serverfault.com/questions/325317/nginx-prevent-dos-by-limiting-worker-processes-connections