質問
ボットや悪意のあるユーザーなどを停止する最善の方法は何ですか?PHPスクリプトの実行が速すぎるからですか?を使っても大丈夫ですか? usleep()
または sleep()
関数は、単にしばらくの間(目的のコードが実行される直前に)「何もしない」ようにするだけですか、それともそれは単純に愚かで、これにはもっと良い方法がありますか?
例:
function login() {
//enter login code here
}
function logout() {
//enter logout code here
}
たとえば、 usleep(3000000)
ログイン コードとログアウト コードの前で問題ありませんか? それとも、私が達成したいことを達成するための、より適切で賢明な方法はありますか?
編集: 以下の提案に基づいて、次のようになります usleep
または sleep
現在のユーザーが実行している現在のスクリプトからプロセッサを解放するだけですか、それともサービス全体からプロセッサを解放しますか?つまり1 人のユーザー + スクリプトが sleep
/usleep
, 、すべての同時ユーザー + スクリプトも遅延しますか?
解決
ほとんどの Web サーバー (Apache など) の動作方法は、ワーカー スレッドのコレクションを維持することです。PHP スクリプトが実行されると、1 つのスレッドが PHP スクリプトを実行します。
スクリプトがそうなったとき sleep(100)
, 、スクリプトの実行には 100 秒かかります。これは、ワーカー スレッドが 100 秒間拘束されることを意味します。
問題は、ワーカー スレッドの数が非常に限られていることです。たとえば、10 個のスレッドがあり、10 人がログインしているとします。これで、Web サーバーはそれ以上の応答を提供できなくなります。
ログイン (またはその他のアクション) のレート制限を行う最善の方法は、ある種の高速なメモリ内ストレージを使用することです (memcached これには最適です) が、これには別のプロセスを実行する必要があり、かなり複雑です (Facebook などを実行している場合は、これを行う可能性があります)。
もっと単純に、次の情報を格納するデータベース テーブルを作成することもできます。 user_id
または ip_address
, first_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 に置き換えられます (高速です)。
他のヒント
停止するボット、悪意のあるユーザーなど PHPスクリプトを実行してから早すぎる?
私が最初にあなたが本当に予防しようとしているものを尋ねるでしょうか?それは、サービス拒否攻撃であれば、私はあなたがPHPスクリプトに追加できるものによって限定されている場合は、あなたができることは何もないと言っていると思います。芸術の状態はあまりプログラマーとして、我々はから守ることができるものを超えています。この目的のために設計されたシステム管理者ツールを見て起動します。
それとも、現実の人々がそれにアクセスすることができますが、ボットができないように、あなたのサービスを制限しようとしていますか?もしそうなら、私はいくつかの「キャプチャ」技術を見て思います。
それとも、ポーリングサイトからユーザーを防止しようとしている毎秒新しいコンテンツを探していますか?もしそうなら、私はRSSフィードまたは彼らはあなたの帯域幅を食べていないので、それらを通知する他の方法を提供する調査と思います。
それとも何か他のですか?
一般的に、私は良い方法です)(いずれも睡眠()やはusleepを言うと思います。
あなたの提案された方法は、ログインする前に、不必要に待機するすべてのユーザーを強制します。
(実際には、ほとんどのルータ/スイッチ、)ほとんどのLAMPサーバは、すでにサービス拒否攻撃を阻止するように構成されています。彼らは、同じIPアドレスから複数の連続したリクエストを拒否することによってこれを行います。
あなたはPHPでの睡眠を入れたくありません。あなたが開いて待機を開催接続を必要がありますので、処理することができますそうすることで大幅に仕える同時要求の数を削減します。
ほとんどのHTTPサーバを使用すると、DoS攻撃を避けるために有効にすることができな特徴を持っていますが、あなただけのIPはあなたがあまりにも最近何回も見てきたアドレスを追跡し、二を待つためにそれらを求めて彼らにメッセージを禁止403を送信する必要があることができません。
何らかの理由であなたが言う(REMOTE_ADDRは、ユーザーの特定(同じファイアウォールの背後にあるすべての人、など)を使用すると、ログインフォームでの挑戦を証明し、リモートのブラウザがそれに拡張された計算を行うこと作ることができることに数えることができない場合は、あなたはすぐに()迅速な乗算で、サーバー側で確認することができること)数を考慮ます。