【发布时间】:2013-12-18 13:52:49
【问题描述】:
背景:ETag 跟踪在here 中得到了很好的解释,在Wikipedia 上也有提及。
answer 我在回复“如何防止 ETags 跟踪?”时写道。驱使我写这个问题。
我有一个阻止 ETag 跟踪的浏览器端解决方案。它无需修改当前的 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();
}
}
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: "EVIl_UNIQUE_TRACKING_ETAG"
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 规范的附加功能
将以下内容视为理论材料,HTTP 规范可能不会很快改变。
1.移除 HEAD 开销
值得注意的是,开销很小,服务器必须发送两次 HTTP 标头:一次响应 HEAD,一次响应 GET。一个理论上的解决方法是修改 HTTP 协议并添加一种请求无标头内容的新方法。然后客户端将仅请求 HEAD,然后仅在 ETag 不匹配时才请求内容。
2。阻止基于缓存的跟踪(或至少使其变得更加困难)
虽然 Sneftel 建议的解决方法不是 ETag 跟踪技术,但它确实可以跟踪人们,即使他们使用我建议的“HEAD, GET”序列。解决方案是限制 ETag 的可能值:ETag 必须是内容的校验和,而不是任何序列。客户端对此进行检查,如果校验和值与服务器发送的值不匹配,则不使用缓存。
旁注: 修复 2 还将消除以下 Evercookie 跟踪技术:pngData、etagData、cacheData。将其与 Chrome 的“仅在我退出浏览器之前保留本地数据”相结合,消除了除 Flash 和 Silverlight cookie 之外的所有 evercookie 跟踪技术。
【问题讨论】:
-
鉴于您在 StackOverflow 上发布了此内容,您要解决的实际编程问题是什么?这似乎是对 cmets 和意见的请求,这不是 SO 的目的,并且可能会在“征求意见”的原因下结束您的问题。
-
我试图通过修改浏览器请求页面的方式来阻止 etag 跟踪。这是一个编程问题,因为实现它涉及修改浏览器的工作方式,而不是修改 HTTP 协议。我不是在征求意见,我是在寻求对此修复的客观反对意见,并寻找可能阻止此修复工作的缺陷。但是,这与安全和网络高度相关,我同意它可能更适合在不同的站点上。我只能等待 SO 人的决定。
-
我在问题中省略了“意见”一词。
-
你是如何实现
load_from_cache()的?我不熟悉任何允许直接访问缓存的 JavaScript 机制。此外,如果您在HEAD请求中未提供 ETag 或任何 cookie(或任何其他标识您自己的方式),您可能会获得一个新的 ETag,这似乎与清除缓存一样有用. -
注意这是伪代码,我还没有实现 load_from_cache。思路是修改浏览器的源码,这和Javascript无关。关于您的第二个论点:除非内容更改,否则不应该获得新的 Etag,无论您的 HEAD 请求如何。如果您为每个请求获取一个新的 Etag,那么服务器正在做一些令人讨厌的事情,并且不为该特定请求使用缓存将是安全的事情。这比清除缓存更有用,因为它相当于只为 Etag 跟踪服务器清除缓存。
标签: http tracking privacy etag cookieless