我需要找出一种方法来唯一地识别访问我正在创建的网站的每台计算机。有没有人对如何做到这一点有什么建议?
因为我希望这个解决方案可以在所有机器和所有浏览器上运行(在合理范围内),所以我尝试使用javascript创建一个解决方案。
Cookies是不行的。
我需要的能力,基本上创建一个guid,这是唯一的计算机和可重复的,假设没有硬件变化发生在计算机上。我正在考虑的方向是获取网卡的MAC和其他这种性质的信息,这些信息将识别访问网站的机器。
发布于 2017-01-11 02:14:54
引言
我不知道是否有或者永远不会有一种方法来单独使用浏览器来唯一地识别机器。主要原因是:
您需要将数据保存在用户的计算机上。用户可以随时删除此数据。除非你有办法重新创建这些数据,这对每一台机器都是唯一的,否则你就卡住了。
验证。您需要防范欺骗、会话劫持等。
即使有方法可以不使用cookies来跟踪计算机,也总会有一种方法绕过它,并且软件将自动执行此操作。如果你真的需要跟踪基于计算机的东西,你将不得不编写一个本机应用程序(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
}, ...]
基于会话的跟踪的优势:
对于已登录的用户,您始终可以从这些用户生成相同的会话id
/
/
..。
您仍然可以使用以下命令跟踪访客用户
..。
即使几个人使用同一台电脑(即网吧),如果他们登录了,你也可以单独跟踪他们。
基于会话的跟踪的缺点:
会话是基于浏览器的,而不是基于计算机的。如果用户使用两个不同的浏览器,则会导致两个不同的会话。如果这是一个问题,你可以在这里停止阅读。
如果用户未登录,会话将过期。如果用户未登录,则他们将使用访客会话,如果用户删除cookie和浏览器缓存,该会话将无效。
实现
有许多方法可以实现这一点。我不认为我可以涵盖所有这些,我只列出我最喜欢的,这将使这篇文章成为一个
固执己见的回答
..。请记住这一点。
基础知识
我将使用所谓的永久cookie来跟踪会话。即使用户删除了他的cookie或更新了他的浏览器,这些数据也会自动重新创建。然而,如果用户同时删除cookie和浏览缓存,它将无法存活。
为了实现这一点,我将使用浏览器缓存机制(
RFC
)、WebStorage接口(
MDN
)和浏览器cookies (
RFC
谷歌分析
)。
法律
为了使用跟踪ids,您需要将它们添加到您的隐私政策和使用条款中,最好是在副标题下
跟踪
..。我们将在这两个应用程序上使用以下密钥
和
_
气体
:谷歌分析数据
_
_
utma
:Google Analytics tracking cookie
侧边
:SessionID
确保在使用跟踪的所有页面上包含隐私政策和使用条款的链接。
我在哪里存储我的会话数据?
您可以将会话数据存储在网站数据库中,也可以存储在用户的计算机上。由于我通常工作在较小的网站(让10000个连续连接),使用第三方应用程序(Google Analytics / Clicky /等),所以对我来说最好将数据存储在客户端计算机上。这有以下优点:
没有数据库查找/开销/负载/延迟/空间等。
用户可以随时删除他们的数据,而不需要给我写烦人的电子邮件。
缺点:
数据必须经过加密/解密和签名/验证,这会在客户端(没那么糟糕)和服务器(bah!)上产生cpu开销。
当用户删除其cookies和缓存时,数据将被删除。(这才是我真正想要的)
当用户离线时,数据不可用于分析。(仅适用于当前浏览用户的分析)
UUIDS
BrowserID
:从浏览器用户代理字符串生成的唯一id。
ComputerID
:由用户IP地址和HTTPS会话密钥生成。
FingerPrintID
:基于改进的基于JavaScript的指纹识别
fingerprint.js
..。
SessionID
:用户第一次访问站点时生成的随机密钥。
GoogleID
:生成自
曲奇。
机制
前几天我在看
温迪·威廉姆斯秀
当主持人建议她的观众每月至少删除一次浏览器历史记录时,她完全被吓坏了。删除浏览器历史记录通常有以下影响:
删除访问过的网站的历史记录。
删除cookies和
(哇,天哪)。
大多数现代浏览器都提供了这个选项,但不害怕成为朋友。因为有一个解决方案。浏览器有一个缓存机制来存储脚本/图像和其他东西。通常,即使我们删除了我们的历史记录,这个浏览器缓存仍然保留着。我们所需要的只是一种在这里存储数据的方法。有两种方法可以做到这一点。更好的方法是使用SVG图像,并将数据存储在其标记中。这样,即使使用闪存禁用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);
}
现在我们可以随时获取会话密钥:
如何让tracking.js在浏览器中卡住?
我们可以使用以下命令来实现这一点
缓存控制
上次修改时间
和
ETag
HTTP标头。我们可以使用
作为etag标头的值:
setHeaders({
"ETag": SessionID,
"Last-Modified": new Date(0).toUTCString(),
"Cache-Control": "private, max-age=31536000, s-max-age=31536000, must-revalidate"
})
header告诉浏览器这个文件基本上永远不会被修改。
通知代理和网关不要缓存文档,但通知浏览器将其缓存1年。
当浏览器下一次请求文档时,它将发送
和
标题。我们可以使用它们返回一个
回应。
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();
}
现在,每次浏览器请求
我们的服务器将响应一个
结果,并强制执行
..。
我还是不明白。给我解释一下
假设用户清除了他们的浏览历史记录并刷新了页面。用户计算机上只剩下一份
在浏览器缓存中。当浏览器请求
它会收到一个
响应,该响应使它执行
它收到了。
执行并还原
被删除了。
验证
假设Haxor X在我们的客户还在登录时窃取了他们的cookie。我们如何保护他们?密码学和浏览器指纹识别来拯救。请记住我们对以下内容的原始定义
是:
BrowserID|ComputerID|randomBytes(256)
我们可以将其更改为:
Timestamp|BrowserID|ComputerID|encrypt(randomBytes(256), hk)|sign(Timestamp|BrowserID|ComputerID|randomBytes(256), hk)
在哪里
..。
现在我们可以验证我们的
使用以下算法:
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的攻击起作用,他们必须:
有相同的
..。这意味着他们必须有相同的ISP提供商作为受害者(棘手)。这将使我们的受害者有机会在他们自己的国家采取法律行动。Haxor还必须从受害者(硬)获取HTTPS会话密钥。
有相同的
..。任何人都可以伪造User-Agent字符串(令人讨厌)。
能够创造自己的假货
(非常难)。因为我们使用时间戳来生成加密/签名密钥,所以基本上就像为每个会话生成一个新的密钥,所以卷标签不起作用。最重要的是,我们加密随机字节,所以简单的字典攻击也是不可能的。
我们可以通过转发来改进验证
和
(通过ajax或隐藏字段)和匹配。
if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;
发布于 2010-07-20 15:14:43
这些人已经开发出一种指纹识别方法,用于以高精度识别用户:
https://panopticlick.eff.org/static/browser-uniqueness.pdf
我们通过版本和配置信息来调查现代web浏览器在多大程度上受到“设备指纹”的影响,这些信息将在请求时传输到网站。我们实现了一种可能的指纹识别算法,并从访问我们测试方的大量浏览器样本中收集了这些指纹,
panopticlick.eff.org
..。我们观察到我们指纹的分布至少包含18.1比特的熵,这意味着如果我们随机选择一个浏览器,我们最多预计286777个其他浏览器中只有一个会共享它的指纹。在支持Flash或Java的浏览器中,情况更糟,平均每个浏览器至少携带18.8比特的识别信息。在我们的样本中,94.2%的带有Flash或Java的浏览器是独一无二的。
通过观察返回的访问者,我们估计随着时间的推移,浏览器指纹可能会以多快的速度变化。在我们的样本中,指纹变化非常快,但即使是一个简单的启发式方法通常也能够猜测出一个指纹是以前观察到的浏览器指纹的“升级”版本,99.1%的猜测是正确的,而误报率只有0.86%。
我们讨论了浏览器指纹识别在实践中造成的隐私威胁,以及可能适合防止它的对策。在防止指纹性和某些类型的可调试性之间存在权衡,在当前的浏览器中,这与隐私有很大的权衡。矛盾的是,如果反指纹隐私技术没有被足够多的人使用,那么它们可能会弄巧成拙;我们表明,一些隐私措施目前成为这种悖论的受害者,但其他措施没有...
发布于 2008-10-19 15:42:42
如果没有所有者的合作,就不可能识别访问网站的计算机。但是,如果他们允许,您可以存储cookie,以便在计算机再次访问您的站点时识别该计算机。关键是,访问者处于控制之中;他们可以删除cookie,并在任何时候以新访问者的身份出现。
https://stackoverflow.com/questions/216542
复制相似问题