HTTP_REFERER を使用してサイト内部へのユーザー アクセスをブロックする
-
08-06-2019 - |
質問
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)/.+
そしてそれは非常にうまく機能したので、ユーザーがサイトにアクセスしたかどうかに関係なく、ユーザーはブロックされました。
そこで、私の質問は次のとおりです。アプリケーションを変更するためのアクセス権/権限/時間がない場合、「ロボット」による特定のページへの直接アクセスを許可しないということをどのように実現できますか?
解決
これを一度に解決できるかどうかはわかりませんが、必要に応じて前後に進むことができます。
まず、あなたが言っていることを繰り返して、明確であることを確認したいと思います。リクエストに適切なリファラーがなく、servlet1 と servlet2 へのリクエストを禁止したいとします。 する クエリ文字列はありますか?(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]
これで少なくとも目標に近づくことができれば幸いです。仕組みを教えてください。あなたの問題に興味があります。
(ところで、私はリファラーのブロックがセキュリティが悪いということに同意しますが、リレーによって不完全で部分的な解決策が強制される場合があることも理解しています。それはあなたもすでに認めているようです。)
他のヒント
解決策はありませんが、リファラーに依存することは決して機能しないと確信しています。ユーザーエージェントはリファラーをまったく送信しないことも、リファラーを侵入させる何かに偽装することも自由であるためです。
http リクエストによってユーザーと悪意のあるスクリプトを区別することはできません。ただし、どのユーザーが短時間に多すぎるページを要求しているかを分析し、その IP アドレスをブロックすることはできます。
リファラーの使用は、検証方法としては非常に信頼性が低くなります。他の方もおっしゃっていますが、簡単に騙されてしまいます。最善の解決策は、(可能であれば)アプリケーションを変更することです。
CAPTCHA を使用するか、ユーザーが最後に訪問したページを追跡する何らかの Cookie またはセッション Cookie を設定し (セッションはなりすましが困難です)、ページ表示履歴を追跡し、そのページを閲覧したユーザーのみを許可することもできます。ブロックしたいページにアクセスするために必要なページ。
これには明らかに問題のアプリケーションにアクセスする必要がありますが、これが最も確実な方法です (完全ではありませんが、私の意見では「十分に良い」方法です)。
Javascript は、画面スクレイピングを防止 (または少なくとも遅延) するもう 1 つの便利なツールです。ほとんどの自動スクレイピング ツールには Javascript インタープリターがないため、隠しフィールドの設定などを行うことができます。
編集:の線に沿った何か このフィル・ハークの記事.
画面のスクレイピングを防止しようとしているのでしょうか?
私の正直な意見では、これを解決するのは困難であり、HTTP_REFERER の値をチェックして修正しようとするのは単なる絆創膏です。わざわざ送信を自動化する人は、「オートマトン」から正しいリファラーを送信できるほど精通しているはずです。
レート制限を試すこともできますが、実際にアプリを変更して、ある時点で何らかの本人認証 (CAPTCHA) を強制しないと、これを防ぐのは難しいことがわかります。
もう少しわかりやすくするために、次のようにします。
はい、HTTP_REFERER の使用が完全に信頼性が低く、やや幼稚であることはわかっていますが、Excel VBA で自動化を行う方法を (おそらく私から) 学んだ人は、期限内に HTTP_REFERER を無効にする方法を知らないだろうと確信しています。最終的な解決策。
アプリケーションコードを変更するアクセス権や権限がありません。政治。貴方はあれを信じますか?したがって、権利所有者が私が要求した変更を行うまで待たなければなりません。
これまでの経験から、要求された変更が本番環境に反映されるまでに 2 か月かかることがわかっています。いいえ、アジャイル手法の本を頭の中に放り込んでも何も改善されませんでした。
これはイントラネット アプリです。ですから、私の威信を傷つけようとする若者は多くありません。しかし、私はまだ若いので、「インド発の非常に豪華な世界的なコンサルティングサービス」の威信を傷つけようとするが、不思議なことにそこではインド人が一人も働いていない。
これまでのところ、最良の答えは「Michel de Mare」からのものです。IPに基づいてユーザーをブロックします。まあ、昨日やったことです。今日は、VPN または DHCP を使用する (IP アドレスから別の IP アドレスに移動する) カンガルー ユーザーがたくさんいるので、より一般的なものを作りたいと思いました。
アンチ CSRF トークンを使用すると、目的を達成できる場合があります。
この記事で詳しく説明します。 クロスサイトリクエストフォージェリ