7

ボットや悪意のあるユーザーなどがphpスクリプトを高速で実行するのを防ぐための最良の方法は何ですか?usleep()または関数を使用しsleep()てしばらくの間(目的のコードが実行される直前に)単に「何もしない」場合は問題ありませんか、それとも単純に愚かであり、これを行うためのより良い方法がありますか?

例:

function login() {
 //enter login code here
}

function logout() {
 //enter logout code here
}

たとえばusleep(3000000)、ログインコードとログアウトコードの前に置くだけで大丈夫ですか、それとも私が達成したいことを達成するためのより良い、より賢明な方法がありますか?

編集:以下の提案に基づいて、プロセッサは現在のユーザーによって実行されている現在のスクリプトから解放されますか、それともサービス全体から解放されますかusleep?つまり、1人のユーザー+スクリプトが/をsleep呼び出す場合、すべての同時ユーザー+スクリプトも遅延しますか?sleepusleep

4

4 に答える 4

8

ほとんどの Web サーバー (Apache など) の動作方法は、ワーカー スレッドのコレクションを維持することです。PHP スクリプトが実行されると、1 つのスレッドが PHP スクリプトを実行します。

スクリプトsleep(100)が実行されると、スクリプトの実行に 100 秒かかります。これは、ワーカー スレッドが 100 秒間拘束されていることを意味します。

問題は、ワーカー スレッドの数が非常に限られていることです。たとえば、10 個のスレッドがあり、10 人がログインするとします。Web サーバーはそれ以上の応答を提供できなくなります。

ログイン (またはその他のアクション) をレート制限する最善の方法は、ある種の高速なメモリ内ストレージを使用することです (これにはmemcachedが最適です)。ただし、これには別のプロセスを実行する必要があり、かなり複雑です ( Facebook のようなものを実行します..)。

user_idもっと簡単に、またはip_addressfirst_failedおよびを格納するデータベース テーブルを持つことができますfailure_counter

ログインに失敗するたびに、(疑似コードで)次のようにします。

if (first_failed in last hour) and (failure_counter > threshold):
    return error_403("Too many authentication failures, please wait")
elseif first_failed in last hour:
    increment failure_counter
else:
    reset first_failed to current time
    increment failure_counter

おそらく最も効率的ではなく、より良い方法がありますが、ブルートフォースをかなりうまく停止するはずです. memcached の使用は基本的に同じですが、データベースが memcached に置き換えられます (より高速です)。

于 2009-02-01T06:47:30.897 に答える
3

ボットや悪意のあるユーザーなどによる php スクリプトの実行速度が速すぎるのを阻止するには?

最初に、あなたが本当に防ごうとしていることは何ですか?それがサービス拒否攻撃である場合、PHP スクリプトに追加できるものによって制限されている場合は、何もできないと言わざるを得ません。最先端の技術は、私たちプログラマーが防御できる範囲をはるかに超えています。この目的のために設計された sysadmin ツールに注目してください。

それとも、実際の人はアクセスできるがボットはアクセスできないように、サービスを制限しようとしていますか? もしそうなら、私はいくつかの「キャプチャ」技術を見てみたい.

それとも、ユーザーが毎秒あなたのサイトをポーリングして新しいコンテンツを探すのを防ごうとしているのですか? もしそうなら、私は RSS フィードを提供するか、帯域幅を使い果たさないように通知する他の方法を調査します。

それとも別のものですか?

一般に、sleep() も usleep() も良い方法ではないと思います。

于 2009-02-01T06:27:00.940 に答える
1

提案された方法では、すべてのユーザーがログインする前に不必要に待機する必要があります。

ほとんどのLAMPサーバー(および実際にはほとんどのルーター/スイッチ)は、サービス拒否攻撃を防ぐようにすでに構成されています。これは、同じIPアドレスからの複数の連続した要求を拒否することによって行われます。

于 2009-02-01T05:42:39.063 に答える
1

あなたはあなたのphpで眠りをつけたくありません。そうすることで、接続が開いたまま待機するため、サーブが処理できる同時リクエストの数が大幅に減少します。

ほとんどのHTTPサーバーには、DoS攻撃を回避するために有効にできる機能がありますが、最近何度も見たIPアドレスを追跡し、1秒待つように求めるメッセージとともに403Forbiddenを送信する必要があります。

何らかの理由でREMOTE_ADDRがユーザー固有であると期待できない場合(同じファイアウォールの背後にいる全員など)、ログインフォームで課題を証明し、リモートブラウザに拡張計算を実行させることができます(たとえば、数値を因数分解します) )サーバー側ですばやく確認できます(迅速な乗算を使用)。

于 2009-02-01T05:52:15.783 に答える