HTTPヘッダーを使用した永続的なノンブロッキングCookie

先週、調査会社のKissMetricsが一意のETagヘッダー値を使用してサイトのユーザーを追跡したと主張する調査からニュースが出ました 。 KissMetrics ETagの使用を拒否、最終的に研究の著者を訴えました (updを参照してください。記事の最後)。



ETag(「要素タグ」の略)を使用してユーザーを追跡することは、過去10年の初めからアフィリエイトネットワークで知られており、使用されています。 また、Last-Modified( spec )ヘッダーを理論的に使用して、一意の更新時間値を使用してユーザーを追跡できることも知られています。



確かに、Last-Modifiedヘッダーが値として任意の文字列を取ることができること、つまり値が正しい日付である必要はないことを知っている人はほとんどいないようです。



例でこれを示すのが最善です。 この例では、最後の変更の日付に異なる値を設定するmy pageを使用します 。 日付値を設定した後にページを更新すると、ブラウザがこの値を送り返すことに気付くでしょう。



最初のリクエスト



サーバーへの最初のリクエストは次のようになります。 異常なことは何も起こりません。



 GET / tracking-cookie HTTP / 1.1
許可:text / html、application / xhtml + xml、application / xml; q = 0.9、* / *; q = 0.8
 Accept-Charset:ISO-8859-1、utf-8; q = 0.7、*; q = 0.3
 Accept-Encoding:gzip、deflate、sdch
 Accept-Language:en-US、en; q = 0.8
キャッシュ制御:max-age = 0
ホスト:nikcub.appspot.com
ユーザーエージェント:Mozilla / 5.0




サーバーの応答:トークンをインストールする



サーバーは応答し、Last-Modifiedの値として一意の識別子(この場合はUUID)を設定します。



 HTTP / 1.0 200 OK
サーバー:dev / 1.0
日付:2011年8月19日(土)7:48:25 GMT
コンテンツタイプ:テキスト/ html; 文字セット= utf8
    最終変更日:d5ee23de-ca05-11e0-ab0b-c336b05508a0
キャッシュ制御:キャッシュなし
コンテンツの長さ:1634




通常、この方法でデータをキャッシュする場合、値は標準の文字列になります:



最終変更日:1994年10月29日(土)19:43:31 GMT


後続の呼び出し



ブラウザは、If-Modified-Since( spec )ヘッダーを使用して、同じURIへのすべての呼び出しでこのトークンを送信します。 ブラウザは、「このリソースの変更日がこの日付より後の場合、私に送信します」と尋ねますが、日付ではなく一意の識別子を送信します。



 GET / tracking-cookie HTTP / 1.1
ホスト:nikcub.appspot.com
接続:キープアライブ
キャッシュ制御:max-age = 0
ユーザーエージェント:Mozilla / 5.0
     If-Modified-Since:d5ee23de-ca05-11e0-ab0b-c336b05508a0
許可:text / html、application / xhtml + xml、application / xml; q = 0.9、* / *; q = 0.8
 Accept-Encoding:gzip、deflate、sdch
 Accept-Language:en-US、en; q = 0.8
 Accept-Charset:ISO-8859-1、utf-8; q = 0.7、*; q = 0.3




これは、ブラウザを閉じて再度開いても機能し、すべての主要なブラウザで機能します。 ETagベースの方法は、特にWebプロキシが邪魔な場合は常に機能するとは限りませんが、Last-Modifiedベースの方法は常に機能します。



解決策



これらの方法の問題は、ユーザーおよびソフトウェアのCookie固有のセキュリティ設定をバイパスすることです。 Cookieはすべてブロックできますが、ETag、Last-Modifed、およびその他の方法を使用すると、ブラウザを追跡できます。



Last-Modified仕様では、値は日付でなければならないが、非同期のクロックの場合に問題が発生する可能性があることに注意してください。 ほとんどのライブラリ実装は、特に日付の解析が本当に頭痛の種であるため、チェックせずにこの値を単純に送り返します。 ブラウザでも同じことが行われ、説明されている問題につながります。 つまり、Last-ModifiedはCookieのように機能しますが、セキュリティチェックは行われません。



すべてのオープンソースブラウザにバグレポートを送信し、日付を正しく解析するように依頼します。 これは、一意の日付を使用してユーザーを追跡し続けることができるため、100%のソリューションではありません。 しかし、おそらく、解決策は、日付を次の時間に持っていくか、日付の有効性に関する他の基本的なチェックの形で見つかるでしょう。 キャッシュをクリアして無効にする以外に解決策はありませんが、一部のブラウザーではブラウザーセッション中に条件付きGET要求が発生します。



この問題は私のページで確認できます



更新 :私が取り組んでいる機密データプラグインParleyは 、サードパーティのサイトからのリクエストをブロックするため、この問題を解決します。 日付解析を追加することを考えています。 これは、このプロジェクトを再び取り上げるときに取り組む必要があるものです(プラグインは少しできることがありますが、WebKitをフォークして独自の安全なブラウザーを作成したい場合もあります)。



更新しました。 KissMetricsは調査の著者を訴えなかったが、KissMetricsを訴えた法律事務所とそのクライアントに対して反訴を提出した。 この研究の著者であるAshkan Soltaniは、これらの主張とは何の関係もありません。



All Articles