5

HttpServer は制御できますが、そこにある ApplicationServer や Java アプリケーションは制御できませんが、これらのアプリケーションの特定のページへの直接アクセスをブロックする必要があります。正確には、適切なサーブレットに対して直接 GET/POST HTTP 要求を発行するフォームへのアクセスをユーザーに自動化してほしくありません。

そこで、 の値に基づいてユーザーをブロックすることにしましたHTTP_REFERER。結局のところ、ユーザーがサイト内を移動している場合、適切なHTTP_REFERER. まあ、それは私が思ったことでした。

.htaccess ファイルに次のような書き換えルールを実装しました。

RewriteEngine on 

# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} !^http://mywebaddress(.cl)?/.* [NC]
RewriteRule (servlet1|servlet2)/.+\?.+ - [F]

サイトをナビゲートしていないが、クエリ文字列を使用して「servlet1」または「servlet2」サーブレットに直接 GET 要求を発行するユーザーへのアクセスを禁止することを期待していました。しかし、正規表現(servlet1|servlet2)/.+\?.+がまったく機能しなかったため、私の期待は突然終わりました。

その表現を に変更したときは本当にがっかりし(servlet1|servlet2)/.+ました。サイトをナビゲートするかどうかに関係なく、ユーザーがブロックされるほどうまく機能しました。

それで、私の質問は次のとおりです。アプリケーションを変更するアクセス/権限/時間がない場合、特定のページへの直接アクセスを持つ「ロボット」を許可しないということをどのように達成できますか?

4

9 に答える 9

2

これを一度に解決できるかどうかはわかりませんが、必要に応じて前後に進むことができます。

まず、あなたが言っていると思うことを繰り返して、はっきりさせたいと思います。サーブレット 1 とサーブレット 2 へのリクエストを禁止したいのですが、リクエストに適切なリファラーがなく、クエリ文字列がありますか? (servlet1|servlet2)/.+\?.+ を理解しているかどうかはわかりません。servlet1 と 2 の下にファイルが必要なように見えるためです。おそらく PATH_INFO (「?」の前) と GET を組み合わせていると思います。クエリ文字列 (「?」の後)。PATH_INFO 部分は機能するようですが、GET クエリ テストは機能しません。script1.cgi と script2.cgi を使用してサーバーで簡単なテストを行ったところ、次のルールが機能して、要求されたことが達成されました。それらは明らかに私の環境に合わせて少し編集されています。

RewriteCond %{HTTP_REFERER} !^http://(www.)?example.(com|org) [NC]
RewriteCond %{QUERY_STRING} ^.+$
RewriteRule ^(script1|script2)\.cgi - [F]

上記は、クエリ文字列を使用してデータを送信しようとした script1.cgi および script2.cgi への間違ったリファラー リクエストをすべてキャッチしました。ただし、path_info を使用してデータを投稿することによって、データを送信することもできます。このフォームを使用して、3 つのメソッドのいずれかが不適切なリファラーで使用されないように保護しました。

RewriteCond %{HTTP_REFERER} !^http://(www.)?example.(com|org) [NC]
RewriteCond %{QUERY_STRING} ^.+$ [OR]
RewriteCond %{REQUEST_METHOD} ^POST$ [OR]
RewriteCond %{PATH_INFO} ^.+$
RewriteRule ^(script1|script2)\.cgi - [F]

あなたが働こうとしていた例に基づいて、これがあなたが望むものだと思います:

RewriteCond %{HTTP_REFERER} !^http://mywebaddress(.cl)?/.* [NC]
RewriteCond %{QUERY_STRING} ^.+$ [OR]
RewriteCond %{REQUEST_METHOD} ^POST$ [OR]
RewriteCond %{PATH_INFO} ^.+$
RewriteRule (servlet1|servlet2)\b - [F]

うまくいけば、これで少なくとも目標に近づくことができます。仕組みを教えてください。あなたの問題に興味があります。

(ところで、リファラーブロックはセキュリティが悪いことに同意しますが、関係性が不完全で部分的な解決策を強制することも理解しています。これは、あなたがすでに認めているようです。)

于 2008-08-06T18:41:13.057 に答える
1

解決策はありませんが、リファラーに依存することは決してうまくいかないに違いありません。ユーザーエージェントは、リファラーをまったく送信しないか、何かにスプーフィングして侵入させることができるからです。

于 2008-08-06T14:49:13.073 に答える
1

http 要求によって、ユーザーと悪意のあるスクリプトを区別することはできません。しかし、どのユーザーが非常に短い時間で多くのページを要求しているかを分析し、その IP アドレスをブロックすることはできます。

于 2008-08-06T15:02:26.587 に答える
1

Javascript は、スクリーン スクレイピングを防ぐ (または少なくとも遅らせる) ためのもう 1 つの便利なツールです。ほとんどの自動スクレイピング ツールには Javascript インタープリターがないため、非表示フィールドの設定などを行うことができます。

編集:この Phil Haackの記事に沿ったもの。

于 2008-08-06T15:03:37.397 に答える
1

リファラーを使用することは、検証方法として非常に信頼できません。他の方もおっしゃっていますが、簡単に騙されます。あなたの最善の解決策は、アプリケーションを変更することです(可能であれば)

CAPTCHA を使用するか、ユーザーが最後にアクセスしたページを追跡するある種の Cookie またはセッション Cookie を設定し (セッションのスプーフィングはより困難になります)、ページ ビューの履歴を追跡し、そのページを閲覧したユーザーのみを許可します。ブロックしたいページに到達するために必要なページ。

これには明らかに問題のアプリケーションにアクセスする必要がありますが、これは最も簡単な方法です (完全ではありませんが、私の意見では「十分」です)。

于 2008-08-06T15:08:30.913 に答える
0

アンチ CSRF トークンを使用して目的を達成できる場合があります。

この記事では、クロスサイト リクエスト フォージェリについて詳しく説明します。

于 2008-08-20T13:06:48.730 に答える
0

検索エンジン ボットが特定のページにアクセスできないようにする場合は、適切な形式のrobots.txtファイルを使用していることを確認してください。

HTTP_REFERER の使用は簡単に偽造されるため、信頼性が低くなります。

もう 1 つのオプションは、既知のボットのユーザー エージェント文字列を確認することです (これにはコードの変更が必要になる場合があります)。

于 2008-08-06T15:32:11.113 に答える
0

画面のスクレイピングを防止しようとしていると思いますか?

私の正直な意見では、解決するのは難しいものであり、HTTP_REFERER の値をチェックして修正しようとするのは、ただの石膏です。わざわざ送信を自動化しようとする人は、「オートマトン」から正しいリファラーを送信するのに十分な知識を持っているでしょう。

レート制限を試すこともできますが、アプリを実際に変更して、ある種の is-this-a-human 検証 (CAPTCHA) をある時点で強制しないと、これを防ぐのが難しくなります。

于 2008-08-06T15:00:15.780 に答える
0

物事をもう少し明確にするために:

  1. はい、HTTP_REFERER を使用することは完全に信頼性が低く、やや幼稚であることはわかっていますが、Excel VBA を使用して自動化を行うことを (私から学んだのでしょうか?) 人々は、HTTP_REFERER を無効にする方法を知らないと確信しています。最終的な解決策。

  2. アプリケーション コードを変更するためのアクセス権や権限がありません。政治。貴方はあれを信じますか?したがって、権利所有者が私が要求した変更を行うまで待つ必要があります。

  3. 以前の経験から、要求された変更が本番環境に反映されるまでに 2 か月かかることはわかっています。いいえ、頭の中にアジャイル方法論の本を放り込んでも、何も改善されませんでした。

  4. これはイントラネット アプリです。ですから、私の名声を傷つけようとする若者はあまりいません。しかし、私は「インドから来た非常に派手なグローバルコンサルティングサービス」の威信を傷つけようとするほど若いですが、不思議なことに、そこで働いているインド人は一人もいません。

これまでのところ、最良の答えは "Michel de Mare" によるものです: IP に基づいてユーザーをブロックします。さて、昨日やったこと。今日は、VPN や DHCP を使用しているカンガルー ユーザー (IP アドレスから別の IP アドレスにジャンプする) が多いため、より一般的なものを作成したいと考えました。

于 2008-08-06T15:58:14.790 に答える