洪水の制限があるユーザーに迷惑をかけず、自動検索を行っているボットをブロックするベストプラクティスは何ですか?何が起こっているかサイト内検索を使用していて、あまりにも多くのリクエストでSQLをオーバーフローさせたボットを扱うにはどうすればよいですか?
:
私は奇妙な検索動作をより意識していると私は最終的にそれが誰であるかをキャッチするために、時間を過ごしました。それは157.55.39です。* Bingとも呼ばれます。これは奇妙です。なぜなら、_GET ['q']が検出されると、noindexが追加されるからです。
問題がされており、入ってくるリクエストのあまりにも多くの事例があるとして、彼らは、SQLサーバーを遅くしていることを
私がこれまで行っているもの:。
を私が検索を実装しています洪水の限界。しかし、私はセッションクッキーでそれを行い、最後の検索タイムスタンプからチェックして計算しています。なぜなら、ビンは明らかにクッキーを無視し続けているからです。
reCAPTHAを追加するのが最悪のシナリオですが、私は "あなたは人間ですか?"あなたが検索するたびにティックボックス。洪水が検出されたときにのみ表示されます。だから、基本的には、本当の問題は、要求を停止するためにreCAPTCHAののいくつかの並べ替えをトリガするために、クライアントからあまりにも多くの要求を検出する方法、..です
EDIT#1:
:私は、現在の状況を取り扱います
<?
# Get end IP
define('CLIENT_IP', (filter_var(@$_SERVER['HTTP_X_FORWARDED_IP'], FILTER_VALIDATE_IP) ? @$_SERVER['HTTP_X_FORWARDED_IP'] : (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP) ? @$_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'])));
# Detect BING:
if (substr(CLIENT_IP, 0, strrpos(CLIENT_IP, '.')) == '157.55.39') {
# Tell them not right now:
Header('HTTP/1.1 503 Service Temporarily Unavailable');
# ..and block the request
die();
}
これは機能します。しかし、それはより体系的な問題への一時的な解決策のようです。
Bingが/search.htmlをインデックスに登録するなどの検索エンジンは、まだ実際には検索しないようにしたいと思います。 "最新の検索"やそれに類するものはないので、どこから問い合わせを受けているのかは分からない。
EDIT#2 - 将来的には他の誰かがこれらの問題を持っている場合、私はそれ
を解く方法を、私はこのことができます願っています。
まず、BingにはGoogleと同じURLパラメータ機能があることがわかります。だから私はBingにURLパラメータ "q"を無視するよう指示することができました。正しい答えに基づいて
が、私はrobots.txtのにパラメータqのための不許可の行を追加しました:
Disallow: /*?q=*
Disallow: /*?*q=*
私はまた、ピーク時のトラフィック上で私たちを気にしないために、Bingのウェブマスターコンソールの内側に語りました。
全体として、これはすぐにサーバーリソース使用量からの肯定的なフィードバックを示しました。しかし、私は、同一のクエリ、特に_GETが関係している場合の全体的なフラッド制限を実装します。したがって、BingがAJAXコールを訪問することを決める場合(例:?action = upvote & postid = 1)。
また、私は157.55.39。*を検出してブロックするとしたら、最も適切な応答は何ですか? HTTP 503または400? –
まともなスクレイパーに検索パスを奪わないように指示するrobots.txtはありませんか? – rene
洪水の制限データをクッキーに保存しようとしましたか?クソそれは非常にばかげた解決です、彼らは決してクッキーを保存/使用しません。非常に簡単な解決策は、MemCachedを使用してそのようなデータを格納することですが、プロジェクトのサイズ(負荷)に大きく依存します。 p.s.また、robots.txt経由で検索エンジンのルールを変更することもできます –