web-dev-qa-db-ja.com

Cookieなしで壊れたサイトの回避策は?

追跡に対するプライバシー保護のため、デフォルトでCookieを拒否するようにブラウザを設定しています。ホワイトリストに登録されたドメインからのCookieのみを許可します。一般的に、これは私には問題ありません。しかし、不便になったケースが少なくとも1つあります。私はワシントンポストのデジタルサブスクリプションの料金を支払います。彼らのジャーナリズムが好きでそれをサポートしたいからです。しかし、彼らや彼らの広告主に追跡されたくないので、ログインしたりクッキーを受け取ったりしません。これは最近まで問題なく機能していました。最近数日以内に、彼らは彼らのウェブサイトで何か新しいことをしました。その結果、私は彼らのホームページを見ることができますが、ストーリーにクリックスルーすると、Firefoxでこのメッセージを受け取ります。

ページが正しくリダイレ​​クトされていません。 Firefoxは、サーバーがこのアドレスへのリクエストを決して完了しない方法でリダイレクトしていることを検出しました。この問題は、Cookieの受け入れを無効にするか拒否することによって引き起こされる場合があります。

これは、サイトをペイウォールしているわけではありません。すべてのCookieを受け入れるように設定されたブラウザでは、ログインせずにすべてのコンテンツにアクセスできますが、ページをクリックすると、washingtonpost.comから約20のCookieと、広告主から約20のCookieが作成されます。ホームページに移動してCookieをクリアし、ストーリーへのリンクをクリックすると、機能しますが、Cookieは再作成されます。したがって、私が見ようとしているページに、これらのCookieを作成しようとするコードがあり、Cookieの作成が失敗した場合にエラーをスローするようです。

私のプライバシーを保護するこの種の状況に適した戦略はありますか?たとえば、自分のマシンで10秒ごとに実行され、ホワイトリストに登録されたドメインのCookieを除くすべてのCookieを削除するスクリプトを書くことを考えました。

関連: https://askubuntu.com/questions/368325/how-to-clear-browsers-cache-and-cookies-from-terminal

19
Ben Crowell

トラッカーが心配な場合は、First Party Isolationを探している可能性があります。

First Party Isolationは、FirefoxがTorブラウザの Cross-Origin Identifier Unlinkability コンセプトから採用した機能です。 FPIは、すべてのCookieをファーストパーティドメイン(URLバー内のドメイン)にリンクし、異なるドメイン間でサードパーティCookieを区別することによって機能します。つまり、a.comにアクセスしていて、トラッカーがCookieを設定し、後で同じトラッカーを使用するb.comにアクセスした場合、以前に配置したCookieを表示することはできません。ファーストパーティドメインが異なっていました(a.com)。別の説明:

ファーストパーティ分離とは

FPIは、ドメインごとにCookieを分離することで機能します。ほとんどのオンライン広告主は、ユーザーがアクセスするサイトごとにユーザーのコンピューターにCookieをドロップし、広告主が広告をロードするため、これは重要です。

FPIが有効になっていると、広告トラッカーはユーザーのPCにドロップしたすべてのCookieを見ることができず、ユーザーが現在表示しているドメイン用に作成されたCookieだけを見ることができます。

これにより、広告トラッカーはユーザーがアクセスするサイトごとに新しいユーザープロファイルを作成する必要があり、広告主はこれらのCookieとユーザーの閲覧履歴を1つの大きな太いプロファイルに集約できなくなります。

(ソース)

FPIを有効にするには、about:configに移動してprivacy.firstparty.isolatetrueに設定するか、公式の First Party Isolationアドオン をインストールします。ただし、アクティブ化する前に、一部のWebアプリは実際の機能をサードパーティのCookieに依存しており、後で使用できなくなる可能性があることに注意してください(たとえば、ログインできない場合があります)。このような問題が発生した場合は、privacy.firstparty.isolate.restrict_opener_accessfalseに設定してみてください。これにより、分離ルールが緩和され、たとえば、ドメイン間でリダイレクトされるクロスドメインログインフロー中に問題が発生する可能性が低くなります異なるドメイン。


Firefoxのもう1つのアプローチは containers です。

コンテナーを使用すると、複数のブラウザープロファイルを使用しなくても、基本的に異なるセッションを互いに分離できます。たとえば、別のコンテナでWaPoを読み取ることができ、そのコンテナ内のトラッカーによって設定されたCookieは他のコンテナでは表示されません。コンテナは、Firefox Nightlyおよび アドオンとして で利用できます。

(Chromeには正確な機能はありませんが、複数のプロファイルを使用して同じ効果を得ることができます。)


私のマシンでは10秒ごとに実行され、ホワイトリストに登録されたドメインからのものを除いてすべてのCookieを削除するスクリプトを書くことを考えました。

これで私が目にする問題は、一部のサイトでは、削除した直後にCookieを再作成することです(まだスクリプトが読み込まれている限り)。また、タイミングが悪いと、無効化されたCookieで発生したのと同じ問題が発生する可能性があります。

最後に、既知のトラッカーを検出してブロックする Ghostery などの信頼できるアドオンもあります。そのため、Cookieを完全に無効にすることなくプライバシーを維持するためのオプションがたくさんあります。残念ながら、最近のウェブではそれほど遠くまでは行けません。

31
Arminius

シークレットブラウザウィンドウ(またはVMインスタンス)を起動してWaPoを表示し、そのサイトでのみ使用するか、アクセスするたびにそれを閉じて新しいものを開きます。

6
JesseM

これは私自身の質問に対する答えの1つにすぎず、おそらく最適なものではありませんが、説明する価値があると思いました。ホワイトリストにないCookieを削除するスクリプトのアイデアを試しました。以下はRuby私が思いついたFirefoxで使用するスクリプトです。Linuxでテストしましたが、おそらくクロスプラットフォームの方法で使用できます(ファイルパスのスラッシュはWindowsで変更されましたか?).

Cookieが保存されているsqliteファイルからすぐにCookieを削除することはできますが、Firefoxは独自のCookieのメモリ内コピーを使用しているようです。したがって、Firefoxを再起動するまで、Cookieの削除は実際には有効になりません。

実際、Firefoxには、ホワイトリストに登録されたCookie以外のすべてのセッションを終了するときに、Cookieを削除する独自のメカニズムがあります。ただし、そのメカニズムを使用するか、セッション内のCookieのホワイトリストを使用するかを選択する必要があります。後者を実行し、このスクリプトを使用することで、より詳細な制御が可能になります。Cookieの設定が許可されていないサイト(デフォルト)、グレーリストのサイト(セッションの終了後にCookieがクリアされる)、およびホワイトリストに登録されているサイト。

長所:

  • Cookieは、FPIの場合のようにウォールオフになるのではなく、実際には(再起動後に)削除されます。これにより、何が起こっているのかが簡単にわかります。
  • 私がまだサイトにいる間はcookieの削除は行われないため、washingtonpost.comのようなサイトは完全に正常に機能します。
  • クロスプラットフォーム(-ish?)。
  • ホワイトリストを維持するのは簡単です。

短所:

  • これは、セッション全体に及ぶ追跡を防ぐだけです。セッション内の短期間の追跡を妨げることはありません。
  • Firefoxでのみ機能します。

コード:

#!/usr/bin/Ruby

require 'sqlite3'

# Delete all cookies except those from hosts on the following list.
# Note that firefox keeps its cookies cached in memory, so this cleaning will not
# take effect inside firefox until you restart firefox.

# Putting foo.com on this list automatically includes www.foo and .foo.
$allowed_hosts = [
  "Amazon.com",
  "bit.ly",
  "github.com",
  "gmx.com",
  "rockclimbing.com",
  "stackexchange.com"
]

$allowed_hosts_all_forms = []
$allowed_hosts.each { |Host|
  $allowed_hosts_all_forms.Push(Host)
  $allowed_hosts_all_forms.Push("www."+Host)
  $allowed_hosts_all_forms.Push("."+Host)
}

def main
  # https://unix.stackexchange.com/questions/82597/where-does-firefox-store-its-cookies-on-linux
  # loop over profiles
  Dir.glob( "#{Dir.home}/.mozilla/firefox/*.default/cookies.sqlite").each { |cookie_file_name|
    print "cookie file #{cookie_file_name}\n"
    begin
      db = SQLite3::Database.open(cookie_file_name)
      print "before deletion:#{list_all_hosts(db).sort.join(' ')}\n"
      allowed = []
      $allowed_hosts_all_forms.each {|Host| allowed.Push("'#{Host}'") } # surround with single quotes
      #print "delete from moz_cookies where Host not in (#{allowed.join(',')});"
      db.execute("delete from moz_cookies where Host not in (#{allowed.join(',')});")
      print "after deletion:#{list_all_hosts(db).sort.join(' ')}\n"
    rescue SQLite3::Exception => e 
      puts "Exception occurred"
      puts e
    ensure
      db.close if db
    end
  }
end

def list_all_hosts(db)
  hosts = []
  db.execute("SELECT Host,name FROM moz_cookies").each { |row|
    hosts.Push(row[0])
  }
  return hosts
end

main()
0
Ben Crowell