ETAGは、WebブラウザーとWebサーバーの間で舞台裏に送信されるHTTPヘッダーです。この値は、特定のファイルがクライアント側でキャッシュされる期間を制御することを目的としています。
このテクノロジーには興味深い副作用があります。 ETAGは、Cookieが削除されてもマシンに保存されます。 一部の人々/ソフトウェア は、この事実を悪用してETAGをCookieのように「動作」させました。
つまり、単にCookieを削除するだけでは不十分です。 Webキャッシュ全体も削除する必要があります。これは、テストマシンでネットサーフィンをするたびに実行するのは面倒なプロセスです。
質問
ETAGヘッダーによって発生する追跡を防ぐ最も信頼できる方法は何ですか?
素晴らしい解決策は知りません。私は3つの防御策を提案できますが、それらにはすべて制限があります。
Privoxy。Privoxy はETagヘッダーをブロックできます。
特に、Privoxy構成で crunch-server-header
または server-header-filter
を使用して、サーバーからのETag:
ヘッダーをブロックできます。また、Privoxy構成で crunch-client-header
または client-header-filter
を使用して、If-None-Match:
およびIf-Modified-Since:
ヘッダーをクライアント。ただし、入手してすぐに使用できる既製の公式については知りません。自分でPrivoxy構成を自分で構築する必要があります。
お使いのブラウザ。Firefoxを使用している場合、ブラウザを終了するたびにキャッシュをクリアするようにFirefoxを設定できます。これはパフォーマンスに悪影響を及ぼす可能性があります。また、このアプローチでは、ETagを使用して任意の1つのブラウザーセッション内でユーザーを追跡できるため、完璧ではありませんが、ブラウザーを終了するとETag Cookieがクリアされます。
RequestPolicy。Firefoxを使用している場合は、 RequestPolicy 拡張を使用できます。 RequestPolicyはETag追跡からの防御に役立つ可能性があります と指摘したライターが1人います。多くの場合、Webサイトは、サードパーティの広告主または分析プロバイダーからのリソースを含めることで追跡します。 RequestPolicyを使用すると、Webページにアクセスしたときにブラウザが要求するサードパーティのリソースを制御できるため、そのような追跡から身を守ることができます。ブラウザがサードパーティの広告主のリソースをロードしない場合、サードパーティ広告主はあなたを追跡する機会がありません(ETagまたはその他のメカニズムを使用)。この防御策は、ポリシーを手間をかけて作成する必要があり、サードパーティのリソースに依存していなくてもWebサイトが直接あなたを追跡できるため、理想的とは言えません。
残念ながら、透過プロキシを介してWebにアクセスすると、プロキシの存在によって 追跡を回避しようとする試みが複雑になる になる場合があります。
@ D.W。によって提案されたより複雑なソリューションに加えて、あなたの ブラウザのプライベートブラウジングモード 、ala InPrivate(IE)、PrivateBrowsing(FF)、Incognito(Chrome)などの使用を検討できます。
ここでの主なことは、ブラウザキャッシュが使用されていないことです(または少なくとも、プライベートセッションの長さを超えて使用されていません)。そのため、Etagはブラウザーによって保存されません。
このアプローチには、セッション内での追跡や、@ D.Wとしてのプロキシなど、いくつかの欠点があります。言及した。とはいえ、使い方はいたって簡単です。
Firefoxを使用している場合は、私のSecretAgentアドオンの(オプション)機能に興味があるかもしれません...追跡を抑制するスプーフィングETagヘッダーを作成します。
欠点は、ETagをスプーフィングすると、トラフィックを最適化するためにETagを使用するサイトのキャッシュが明らかに損なわれることです(ただし、パフォーマンスへの影響は非常に小さいようです)。
www.secretagent.org.uk を参照してください。
(免責事項:私はSecretAgentの作成者です)。
更新:回答を別の方法でより明確に記述しました
現在のHTTPプロトコルを変更せずに機能するソリューションがあります。これの実装を見たいです。
Etagをサーバーに通知する代わりに、Etagについてサーバーに問い合わせ、既存のEtagと比較します。
疑似コード:
If (file_not_in_cache)
{
page=http_get_request();
page.display();
page.put_in_cache();
}
else
{
page=load_from_cache();
client_etag=page.extract_etag();
server_etag=http_HEAD_request().extract_etag();
//Instead of saying "my etag is xyz",
//the client says: what is YOUR etag, server?"
if (server_etag==client_etag)
{
page.display();
}
else
{
page.remove_from_cache();
page=http_get_request();
page.display();
page.put_in_cache();
}
}
ソリューション1を使用したHTTP会話の例:
クライアント:
HEAD /posts/46328
Host: security.stackexchange.com
サーバ:
HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
ETag: "ABCDE"
Content-Type: text/html
Content-Length: 131
ケース1、クライアントには同じetagがあります。
Connection closes, client loads page from cache.
ケース2、クライアントに一致しないetagがあります:
GET...... //and a normal http conversation begins.
編集:わずかなオーバーヘッドがあることに注意する必要があります。サーバーはHTTPヘッダーを2回送信する必要があります。 GETへの応答。これに対する理論的な回避策の1つは、HTTPプロトコルを変更し、ヘッダーのないコンテンツを要求する新しいメソッドを追加することです。次に、etagsが一致しない場合、クライアントはHEAD=のみを要求し、次にコンテンツのみを要求します。
編集2:私はmakerofthings7のアドバイスに従い、これを stackoverflowに関する質問 として投稿しました。
今後の解決策としては、etagsを無効にするブラウザー設定が考えられます。
Mozillaの場合、この問題は ETag:Webトラッキングに対抗するためのフィルタリング で説明されています。