如何唯一标识访问我的网站的计算机?介绍实现
我需要找出一种方法来唯一地识别访问我正在创建的网站的每台计算机。有没有人对如何实现这一目标有任何建议?
因为我希望解决方案可以在所有机器和所有浏览器上运行(在合理范围内),所以我正在尝试使用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,您需要将它们添加到您的隐私政策和使用条款中,最好是在子标题“跟踪”下。我们将在 和 上使用以下键:document.cookie
window.localStorage
请确保在使用跟踪的所有页面上包含指向您的隐私政策和使用条款的链接。
您可以将会话数据存储在网站数据库或用户计算机上。由于我通常在使用第三方应用程序(Google Analytics /Clicky /等)的较小站点(少于1万个连续连接)上工作,因此我最好将数据存储在客户端计算机上。这具有以下优点:
和缺点:
Browser|BrowserVersion|OS|OSVersion|Processor|MozzilaMajorVersion|GeckoMajorVersion
getISP(requestIP)|getHTTPSClientKey()
FingerPrint.get()
BrowserID|ComputerID|randombytes(256)
__utma
getCookie(__utma).uniqueid
前几天,我和女朋友一起看温迪·威廉姆斯(Wendy Williams)的节目,当主持人建议她的观众每月至少删除一次浏览器历史记录时,我感到非常震惊。删除浏览器历史记录通常具有以下效果:
window.localStorage
大多数现代浏览器都使此选项随时可用,但不用担心朋友。因为有一个解决方案。浏览器具有缓存机制来存储脚本/图像和其他内容。通常,即使我们删除历史记录,此浏览器缓存仍然存在。我们所需要的只是一种在这里存储数据的方法。有2种方法可以做到这一点。更好的方法是使用SVG图像并将我们的数据存储在其标签中。这样,即使使用闪存禁用了 JavaScript,仍然可以提取数据。但是,由于这有点复杂,我将演示使用JSONP(维基百科)的另一种方法。)
example.com/assets/js/tracking.js(实际跟踪.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") || ""
如何使跟踪.js保留在浏览器中?
我们可以使用缓存控制,上次修改和ETag HTTP标头来实现这一点。我们可以将 as 值用于 etag 标头:SessionID
setHeaders({
"ETag": SessionID,
"Last-Modified": new Date(0).toUTCString(),
"Cache-Control": "private, max-age=31536000, s-max-age=31536000, must-revalidate"
})
Last-Modified
header告诉浏览器这个文件基本上从不被修改。 告诉代理和网关不要缓存文档,但告诉浏览器将其缓存1年。Cache-Control
下次浏览器请求文档时,它将发送和标头。我们可以使用它们来返回响应。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;
现在,为了使哈克索的攻击起作用,他们必须:
ComputerID
BrowserID
SessionID
我们可以通过转发和(通过ajax或隐藏字段)并与它们进行匹配来改善验证。GoogleID
FingerprintID
if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;
这些人开发了一种指纹识别方法,用于以高精度识别用户:
https://panopticlick.eff.org/static/browser-uniqueness.pdf
我们调查现代网络浏览器在多大程度上受到“设备指纹识别”的影响,通过它们将根据要求传输到网站的版本和配置信息。我们实现了一种可能的指纹识别算法,并从访问我们测试端的大量浏览器样本中收集这些指纹,panopticlick.eff.org。我们观察到,我们的指纹分布至少包含18.1位的熵,这意味着如果我们随机选择一个浏览器,我们最多只能期望286,777个其他浏览器中只有一个会共享其指纹。在支持Flash或Java的浏览器中,情况更糟,平均浏览器携带至少18.8位的识别信息。在我们的样本中,94.2% 的采用 Flash 或 Java 的浏览器都是独一无二的。
通过观察回头客,我们估计浏览器指纹随时间变化的速度。在我们的样本中,指纹变化相当快,但即使是简单的启发式通常也能够猜测指纹是以前观察到的浏览器指纹的“升级”版本,99.1%的猜测正确,误报率仅为0.86%。
我们讨论了浏览器指纹识别在实践中构成的隐私威胁,以及哪些对策可能适合于防止它。在可指纹识别性和某些类型的可调试性之间存在权衡,这在当前的浏览器中严重违反隐私。矛盾的是,如果足够多的人没有使用反指纹隐私技术,它们可能会弄巧成拙;我们表明,一些隐私措施目前成为这一悖论的受害者,但其他隐私措施则不然......