web-dev-qa-db-ja.com

リファラーヘッダーで遊ぶ

2つのサイトがあります。

http://www.site1.com
http://www.site2.com

http://www.site1.comにはhttp://www.site2.comへのリンクが含まれています

<a href="http://www.site2.com/">link<a/>

ユーザーがhttp://www.site1.comからのリンクをクリックすると、ブラウザはRefererヘッダーをhttp://www.site2.comに送信します。リファラーヘッダーに基づいて、http://www.site2.comはいくつかのプロセスを実行します。

(多分JavaScript、PHPなどで)偽造/変更できるかどうか疑問に思いますリファラーヘッダーまたはそれをまったく送信しないのですか?

16
torayeff

Refererヘッダーを制御する2つの状況があります。ちなみに、RefererはWordの「リファラー」のスペルミスです。

お使いのブラウザを制御してReferersite2.comに渡さないようにしたい場合は、多くのブラウザ拡張機能を使用できます。

  • Firefoxには RefControl があります(これを使用して満足しています。「サイトのルートを送信する」オプションを使用しています)。
  • Chromeには Referer Control があります

他の状況は、あなたがwebmasterであり、-あなたのサイトのユーザー(site1.com)がRefererを他のリンクされたサイトに送信しないようにする場合ですあなたのサイトで。複数の方法でそれを行うことができます:

  • サイトでSSL/TLS(https)を使用し、ブラウザのセキュリティ機能が、SSL/TLSを使用して提供されるページのRefererto HTTPリンクを渡さないようにします。ただし、ページのリンクがHTTPSを使用している場合、Refererは、以下で説明する他の方法で明示的にオフにしない限り、引き続き渡されます。
  • HTML5のrel="noreferrer"属性を使用します。すべての主要なブラウザで supported です。
  • データURL( 'data:')を使用して、リンク元の実際のページを非表示にします:<a href='data:text/html;charset=utf-8, <html><meta http-equiv="refresh" content="0;URL=&#39;http://site2.com/&#39;"></html>'>Link text</a>
  • 中間ページにリダイレクトしてRefererを非表示にします。このタイプのリダイレクトは、潜在的に悪意のあるリンクがRefererを使用して情報(たとえば、クエリ文字列のセッションID)を取得するのを防ぐためによく使用されます。多くの大規模なコミュニティWebサイトでは、外部リンクにリンクリダイレクトを使用して、アカウント情報を盗むために使用される可能性のある悪用の可能性を減らし、ユーザーがサービスを離れるときにそれを明らかにして、効果的なフィッシングの可能性を減らします。

PHPでの単純なリダイレクトの例を次に示します。

<?php
$url = htmlspecialchars($_GET['url']);
header( 'Refresh: 0; url=http://'.$url );
?>
<html>
 <head>
  <title>Redirecting...</title>
  <meta http-equiv="refresh" content="0;url=http://<?php echo $url; ?>">
 </head>
 <body>
 Attempting to redirect to <a href="http://<?php echo $url; ?>">http://<?php echo $url; ?></a>.
 </body>
</html>
30
Cristian Dobre

2015年現在、これはWebサイトがリファラーヘッダーを送信しないようにする方法です。

これをWebページのヘッドセクションに追加するだけです。

 <meta name="referrer" content="no-referrer" />

これは機能しますリンクとAjaxリクエストの両方ページ上のJavaScriptコードによって作成されます。

その他の有効なmetaオプションは次のとおりです。

<meta name="referrer" content="unsafe-url" />
<meta name="referrer" content="Origin" />
<meta name="referrer" content="no-referrer-when-downgrade" />
<meta name="referrer" content="Origin-when-cross-Origin" />

•お使いのブラウザで動作するかどうかを確認してください: http://caniuse.com/#feat=referrer-policy

•仕様はこちらをご覧ください: http://w3c.github.io/webappsec/specs/referrer-policy/

注: JavaScriptのみを使用してリファラーを削除する場合は、Ajaxリクエストを行う直前に適切なメタタグを動的に追加できると思います。ただし、これはテストしていません。

また、ブラウザはドメインとポートを含むOriginヘッダーを送信するようになりました。私の知る限り、削除することはできません。 <meta name="referrer" content="Origin" />を使用する場合、リファラーにはOriginヘッダーと同様の情報が含まれます。これは、ユーザーの正確なページを隠すため、プライバシーの観点からはすでに優れています。

9
MarcG

呼び出し元のクライアントを制御しない限り、リファラーヘッダーを変更することはできません。ブラウザ。

ブラウザはリファラーの変更をブロックします。サーバーからクライアントにヘッダーを取得する方法がないため、サーバー側のコードはリクエストにヘッダーを挿入できません。また、クライアントに次のリクエストのリファラーヘッダーにヘッダーを挿入させることができます。

ただし、ブラウザにはJavaScriptからのヘッダーインジェクションに関する特定の脆弱性がないことが前提となっています。

4
Steve

pythonスクリプト( http://docs.python-requests.org/en/latest/ を参照)を書いて、標準のurllibが見える場合、複雑ですが、FirefoxのTamper data/live httpヘッダープラグインを使用してリファラーを偽装できると思います。確かではありませんが、見てください。リファラーヘッダーを操作できる他のfirefoxアドオンもあります。 Firefoxアドオンのリファラー。

0
xeet

紹介問題とその履歴の優れた概要は、 "楽しさと利益のために紹介者を取り除く" にあります。

同じ記事には、以下への優れたリンクも含まれています。

  1. 私たちの間で怠惰な人のために、 referer.us URLリダイレクションサービス、さらに良いことに、
  2. A ブラウザに依存しないクライアント側スクリプト 、素晴らしい<iframe src=about:blank> 騙す。
0

HTTPヘッダーを作成することは難しくありません。

ターミナルとnetcatcat(ネットワーク上)。

次のように:

nc << eof www.site2.com 80
GET /somepath/somedest HTTP/1.0
Host: wwww.site2.com
Referer: wwww.site1.com

.
eof

十分かもしれません。

(注:ドット.末尾の意味はありませんが、空行はヘッダーの終わりを示します)

したがって、答えはyes HTTPヘッダーを偽造することが可能です。

これはFirefox 19.0で行われました

hidingリファラーフィールドの場合、数年前からsquidプロキシサーバーでオプションを使用しましたが、ブラウザ用のモジュールまたは拡張機能が存在する必要があると確信していますトリックをします...

... Firefox(v19.0)の設定をざっと見てみると、オプションがあることがわかります:network.http.sendRefererHeader

このオプションは次のように設定できます。

  • 0 Refererヘッダーを送信したり、document.referrerを設定したりしないでください。
  • 1リンクをクリックしたときにRefererヘッダーを送信し、次のページのdocument.referrerを設定します。
  • 2(デフォルト)リンクをクリックするか、画像をロードするときに、Refererヘッダーを送信し、次のページのdocument.referrerを設定します。
0
F. Hauri