0

重複の可能性:
PHPスクリプトがフラッディングするのを防ぎます

私の特定の「友達」は、更新キーを押したままにして、私のサイトをいじり続けています。これにより、コンテンツのページビューが非現実的に増加し、PHPの実行が停止するポイントにサーバーの負荷が追加されます。

PHPまたはJavaScriptを使用して、このような激しい更新(そのうちの1つは1時間半で3万件のリクエストを受け取った)を防ぐ方法があるかどうかを期待していましたか?

4

3 に答える 3

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
   }
}

そのコードをサイトのすべてのページに配置すると、ユーザーが事前に定義されたセキュリティルールに違反していないことが保証されます。

于 2012-10-22T19:25:37.230 に答える
1

これには、 fail2banなどのツールを使用します。

たとえば、特定の時間内に同じ URL に対してあまりにも多くのリクエストを行う場合に、リクエスタの IP アドレスをブロックするルールを作成できます。また、ブロックされる期間を構成できます。

この方法の利点は、ネットワーク レベルで既にブロックが行われているため、サーバーの負荷が軽減されることです。

于 2012-10-22T19:38:26.753 に答える
1

単一の IP などからの接続試行の制限については、apache/nginx のマニュアルをお読みください。

いくつかの読み取り:

https://serverfault.com/questions/325317/nginx-prevent-dos-by-limiting-worker-processes-connections

Apache でレート制限を実装するにはどうすればよいですか? (1 秒あたりの要求数)

于 2012-10-22T19:38:58.020 に答える