我需要找到一种方法来唯一标识访问我正在创建的网站的每台计算机。有人对如何实现这一目标有任何建议吗?
因为我希望该解决方案适用于所有机器和所有浏览器(在合理范围内),所以我正在尝试使用 javascript 创建一个解决方案。
饼干不行。
我需要能够基本上创建一个唯一的计算机和可重复的 guid,假设计算机没有发生硬件更改。我正在考虑的方向是获取网卡的 MAC 和其他这种性质的信息,这些信息将识别访问网站的机器。
我需要找到一种方法来唯一标识访问我正在创建的网站的每台计算机。有人对如何实现这一目标有任何建议吗?
因为我希望该解决方案适用于所有机器和所有浏览器(在合理范围内),所以我正在尝试使用 javascript 创建一个解决方案。
饼干不行。
我需要能够基本上创建一个唯一的计算机和可重复的 guid,假设计算机没有发生硬件更改。我正在考虑的方向是获取网卡的 MAC 和其他这种性质的信息,这些信息将识别访问网站的机器。
我不知道是否有或将有一种方法可以单独使用浏览器来唯一标识机器。主要原因是:
即使有办法在不使用 cookie 的情况下跟踪计算机,也总有一种方法可以绕过它,并且软件会自动执行此操作。如果您确实需要基于计算机跟踪某些内容,则必须编写本机应用程序(Apple Store / Android Store / Windows Program / 等)。
我可能无法回答您提出的问题,但我可以向您展示如何实施会话跟踪。通过会话跟踪,您可以尝试跟踪浏览会话而不是访问您网站的计算机。通过跟踪会话,您的数据库架构将如下所示:
sesssion:
sessionID: string
// Global session data goes here
computers: [{
BrowserID: string
ComputerID: string
FingerprintID: string
userID: string
authToken: string
ipAddresses: ["203.525....", "203.525...", ...]
// Computer session data goes here
}, ...]
基于会话的跟踪的优点:
username
/ password
/ email
。sessionID
.基于会话的跟踪的缺点:
有很多方法可以实现这一点。我不认为我可以涵盖所有这些我只会列出我最喜欢的,这将使这成为一个固执的答案。请记住这一点。
我将使用所谓的永久 cookie 来跟踪会话。即使用户删除了他的 cookie 或更新了他的浏览器,这些数据也会自动重新创建。然而,它不会在用户删除他们的 cookie 和他们的浏览缓存后继续存在。
为了实现这一点,我将使用浏览器缓存机制 ( RFC )、WebStorage API ( MDN ) 和浏览器 cookie(RFC、Google Analytics)。
为了使用跟踪 ID,您需要将它们添加到您的隐私政策和使用条款中,最好在子标题Tracking 下。我们将在document.cookie
和 上使用以下键window.localStorage
:
确保在所有使用跟踪的页面上包含指向隐私政策和使用条款的链接。
您可以将会话数据存储在您的网站数据库或用户计算机上。由于我通常在使用 3rd 方应用程序(Google Analytics / Clicky / 等)的较小站点(允许超过 10,000 个连续连接)上工作,因此最好将数据存储在客户端计算机上。这具有以下优点:
和缺点:
Browser|BrowserVersion|OS|OSVersion|Processor|MozzilaMajorVersion|GeckoMajorVersion
getISP(requestIP)|getHTTPSClientKey()
FingerPrint.get()
BrowserID|ComputerID|randombytes(256)
__utma
cookie生成。getCookie(__utma).uniqueid
有一天,我和我的女朋友一起看wendy williams 的节目,当主持人建议她的观众至少每月删除一次浏览器历史记录时,我感到非常震惊。删除浏览器历史记录通常有以下效果:
window.localStorage
(aww man)。大多数现代浏览器都使这个选项随时可用,但不要害怕朋友。因为有解决办法。浏览器有一个缓存机制来存储脚本/图像和其他东西。通常即使我们删除历史记录,这个浏览器缓存仍然存在。我们所需要的只是一种在此处存储数据的方法。有两种方法可以做到这一点。更好的方法是使用 SVG 图像并将我们的数据存储在其标签中。即使使用 Flash 禁用 JavaScript,这种方式仍然可以提取数据。但是,由于这有点复杂,我将演示使用 JSONP 的另一种方法(维基百科)
example.com/assets/js/tracking.js(实际上是 tracking.php)
var now = new Date();
var window.__sid = "SessionID"; // Server generated
setCookie("sid", window.__sid, now.setFullYear(now.getFullYear() + 1, now.getMonth(), now.getDate() - 1));
if( "localStorage" in window ) {
window.localStorage.setItem("sid", window.__sid);
}
现在我们可以随时获取会话密钥:
window.__sid || window.localStorage.getItem("sid") || getCookie("sid") || ""
如何让 tracking.js 坚持在浏览器中?
我们可以使用Cache-Control、Last-Modified和ETag HTTP 标头来实现这一点。我们可以使用SessionID
etag 标头的as 值:
setHeaders({
"ETag": SessionID,
"Last-Modified": new Date(0).toUTCString(),
"Cache-Control": "private, max-age=31536000, s-max-age=31536000, must-revalidate"
})
Last-Modified
header 告诉浏览器这个文件基本上不会被修改。Cache-Control
告诉代理和网关不要缓存文档,而是告诉浏览器将其缓存 1 年。
下次浏览器请求文档时,它将发送If-Modified-Since
和If-None-Match
标头。我们可以使用这些来返回304 Not Modified
响应。
example.com/assets/js/tracking.php
$sid = getHeader("If-None-Match") ?: getHeader("if-none-match") ?: getHeader("IF-NONE-MATCH") ?: "";
$ifModifiedSince = hasHeader("If-Modified-Since") ?: hasHeader("if-modified-since") ?: hasHeader("IF-MODIFIED-SINCE");
if( validateSession($sid) ) {
if( sessionExists($sid) ) {
continueSession($sid);
send304();
} else {
startSession($sid);
send304();
}
} else if( $ifModifiedSince ) {
send304();
} else {
startSession();
send200();
}
现在每次浏览器请求tracking.js
我们的服务器都会响应一个304 Not Modified
结果并强制执行tracking.js
.
我还是不明白。给我解释
假设用户清除了他们的浏览历史记录并刷新了页面。唯一留在用户计算机上的是tracking.js
浏览器缓存中的副本。当浏览器请求tracking.js
时304 Not Modified
,tracking.js
它会收到一个响应,导致它执行收到的第一个版本。tracking.js
执行并恢复SessionID
被删除的。
假设 Haxor X 在客户仍处于登录状态时窃取了他们的 cookie。我们如何保护他们?密码学和浏览器指纹识别来拯救。记住我们最初的定义SessionID
是:
BrowserID|ComputerID|randomBytes(256)
我们可以将其更改为:
Timestamp|BrowserID|ComputerID|encrypt(randomBytes(256), hk)|sign(Timestamp|BrowserID|ComputerID|randomBytes(256), hk)
哪里hk = sign(Timestamp|BrowserID|ComputerID, serverKey)
。
现在我们可以SessionID
使用以下算法验证我们的:
if( getTimestamp($sid) is older than 1 year ) return false;
if( getBrowserID($sid) !== createBrowserID($_Request, $_Server) ) return false;
if( getComputerID($sid) !== createComputerID($_Request, $_Server) return false;
$hk = sign(getTimestamp($sid) + getBrowserID($sid) + getComputerID($sid), $SERVER["key"]);
if( !verify(getTimestamp($sid) + getBrowserID($sid) + getComputerID($sid) + decrypt(getRandomBytes($sid), hk), getSignature($sid), $hk) ) return false;
return true;
现在为了让 Haxor 的攻击起作用,他们必须:
ComputerID
。这意味着他们必须拥有与受害者相同的 ISP 提供商(Tricky)。这将使我们的受害者有机会在他们自己的国家采取法律行动。Haxor 还必须从受害者(硬)那里获取 HTTPS 会话密钥。BrowserID
。任何人都可以欺骗用户代理字符串(烦人)。SessionID
(Very Hard)。批量攻击将不起作用,因为我们使用时间戳来生成加密/签名密钥,所以基本上就像为每个会话生成一个新密钥一样。最重要的是,我们加密随机字节,因此简单的字典攻击也是不可能的。我们可以通过转发GoogleID
和FingerprintID
(通过 ajax 或隐藏字段)和匹配来改进验证。
if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;
这些人开发了一种指纹识别方法,可以高精度地识别用户:
https://panopticlick.eff.org/static/browser-uniqueness.pdf
我们通过现代 Web 浏览器根据请求传输到网站的版本和配置信息来调查现代 Web 浏览器在多大程度上受到“设备指纹识别”的影响。我们实现了一种可能的指纹识别算法,并从访问我们测试端panopticlick.eff.org的大量浏览器样本中收集了这些指纹 . 我们观察到我们的指纹分布至少包含 18.1 位的熵,这意味着如果我们随机选择一个浏览器,我们最多预计 286,777 个其他浏览器中只有一个会共享它的指纹。在支持 Flash 或 Java 的浏览器中,情况更糟,平均浏览器携带至少 18.8 位的识别信息。94.2% 的 Flash 或 Java 浏览器在我们的样本中是独一无二的。
通过观察回访者,我们估计浏览器指纹随时间变化的速度。在我们的样本中,指纹变化非常快,但即使是简单的启发式方法通常也能猜出指纹何时是先前观察到的浏览器指纹的“升级”版本,99.1% 的猜测正确,误报率仅为 0.86% .
我们讨论了浏览器指纹识别在实践中会带来哪些隐私威胁,以及可能适合采取哪些对策来防止这种威胁。在防止指纹识别和某些类型的可调试性之间存在权衡,在当前的浏览器中,这在很大程度上与隐私权重重。矛盾的是,如果没有足够多的人使用,反指纹隐私技术可能会自我挫败;我们表明,一些隐私措施目前成为这一悖论的牺牲品,但其他措施则没有……
如果没有所有者的合作,就不可能识别访问网站的计算机。但是,如果他们允许,您可以存储一个 cookie 以在机器再次访问您的网站时识别该机器。关键是,访客在掌控;他们可以随时删除 cookie 并以新访客的身份出现。
一种可能性是使用flash cookie:
您需要构建一个小的(隐藏的)Flash 电影来读取和写入它们。
无论您选择什么路线,请确保您的用户选择加入被跟踪,否则您就是在侵犯他们的隐私并成为坏人之一。
您可能想尝试在 evercookie 中设置唯一 ID(它可以跨浏览器工作,请参阅他们的常见问题解答):http ://samy.pl/evercookie/
还有一家叫ThreatMetrix的公司,很多大公司都在用它来解决这个问题:http ://threatmetrix.com/our-solutions/solutions-by-product/trustdefender-id/ 它们相当昂贵,一些他们的其他产品不是很好,但他们的设备 ID 运行良好。
最后,还有这个 panopticlick 想法的开源 jquery 实现:https : //github.com/carlo/jquery-browser-fingerprint 现在看起来还很成熟, 但可以扩展。
希望能帮助到你!