这只是我自己问题的一个可能答案,可能不是最佳答案,但我认为值得描述。我尝试了使用脚本删除不在白名单上的 cookie 的想法。下面是我想出的用于 Firefox 的 ruby 脚本。我在 linux 中对其进行了测试,但它可能可以跨平台使用(可能需要为 Windows 更改文件路径中的斜线?)。
看来,虽然我可以立即从存储它们的 sqlite 文件中删除 cookie,但 firefox 使用它自己的 cookie 内存副本。因此,在我重新启动 Firefox 之前,cookie 的删除实际上不会生效。
Firefox 实际上有自己的机制,可以在每个会话结束时删除除白名单外的所有 cookie。但是,您必须选择使用该机制或在会话中对 cookie 使用白名单。通过执行后者并使用此脚本,我获得了更精细的控制:我有不允许设置 cookie 的站点(默认)、列入灰名单的站点(会话结束后清除 cookie),以及列入白名单的网站。
优点:
- cookie 实际上已经消失(在重新启动后),而不是像 FPI 中那样被隔离。这使得很容易知道发生了什么。
- 像washingtonpost.com 这样的网站运行绝对正常,因为我还在网站上时不会删除cookies。
- 跨平台(-ish?)。
- 维护白名单对我来说很简单。
缺点:
- 这只会阻止跨会话扩展的跟踪。它不会阻止会话中的短期跟踪。
- 仅适用于火狐。
代码:
#!/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()