如何唯一标识访问我的网站的计算机?介绍实现

2022-08-30 01:16:34

我需要找出一种方法来唯一地识别访问我正在创建的网站的每台计算机。有没有人对如何实现这一目标有任何建议?

因为我希望解决方案可以在所有机器和所有浏览器上运行(在合理范围内),所以我正在尝试使用javascript创建解决方案。

饼干不行。

我需要能够基本上创建一个计算机独有的且可重复的guid,假设计算机没有发生硬件更改。我正在考虑的方向是获取网卡的MAC和其他此类信息,这些信息将识别访问网站的机器。


答案 1

介绍

我不知道是否有或曾经有过一种方法来单独使用浏览器来唯一识别机器。主要原因是:

  • 您需要在用户计算机上保存数据。用户可以随时删除此数据。除非你有办法重新创建这些数据,这些数据对于每台机器都是唯一的,否则你就会陷入困境。
  • 验证。您需要防范欺骗,会话劫持等。

即使有办法在不使用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
  }, ...]

基于会话的跟踪的优点:

  1. 对于已登录的用户,您始终可以从用户 / / 生成相同的会话 ID。usernamepasswordemail
  2. 您仍然可以使用 跟踪来宾用户。sessionID
  3. 即使几个人使用同一台计算机(即网吧),如果他们登录,您也可以单独跟踪他们。

基于会话的跟踪的缺点:

  1. 会话基于浏览器,而不是基于计算机。如果用户使用2个不同的浏览器,则将导致2个不同的会话。如果这是一个问题,你可以在这里停止阅读。
  2. 如果用户未登录,会话将过期。如果用户未登录,则他们将使用访客会话,如果用户删除cookie和浏览器缓存,该会话将失效。

实现

实现此目的的方法有很多种。我不认为我可以涵盖所有内容,我只列出我最喜欢的,这将使这成为一个固执己见的答案。请记住这一点。

基本

我将使用所谓的永久 cookie 来跟踪会话。这些数据将自动重新创建,即使用户删除其cookie或更新其浏览器。但是,它不会在用户删除其cookie和浏览缓存后幸存下来。

为了实现这一点,我将使用浏览器缓存机制(RFC),WebStorage API(MDN)和浏览器cookie(RFCGoogle Analytics)。

法律

为了使用跟踪ID,您需要将它们添加到您的隐私政策和使用条款中,最好是在子标题“跟踪”下。我们将在 和 上使用以下键:document.cookiewindow.localStorage

  • _ga:谷歌分析数据
  • __utma: 谷歌分析跟踪 cookie
  • sid: 会话 ID

请确保在使用跟踪的所有页面上包含指向您的隐私政策和使用条款的链接。

会话数据应存储在哪里?

您可以将会话数据存储在网站数据库或用户计算机上。由于我通常在使用第三方应用程序(Google Analytics /Clicky /等)的较小站点(少于1万个连续连接)上工作,因此我最好将数据存储在客户端计算机上。这具有以下优点:

  1. 没有数据库查找/开销/负载/延迟/空间/等。
  2. 用户可以随时删除他们的数据,而无需给我写烦人的电子邮件。

和缺点:

  1. 数据必须加密/解密和签名/验证,这会在客户端(不是那么糟糕)和服务器(bah!)上产生CPU开销。
  2. 当用户删除其 Cookie 和缓存时,数据将被删除。(这是我真正想要的)
  3. 当用户离线时,数据不可用于分析。(仅针对当前浏览用户的分析)

UUIDS

  • BrowserID:从浏览器用户代理字符串生成的唯一 ID。Browser|BrowserVersion|OS|OSVersion|Processor|MozzilaMajorVersion|GeckoMajorVersion
  • 计算机 ID:从用户 IP 地址和 HTTPS 会话密钥生成。getISP(requestIP)|getHTTPSClientKey()
  • FingerPrintID:基于JavaScript的指纹识别,基于修改后的指纹.jsFingerPrint.get()
  • 会话 ID:用户第一次访问网站时生成的随机密钥。BrowserID|ComputerID|randombytes(256)
  • 谷歌ID:从 cookie 生成。__utmagetCookie(__utma).uniqueid

机制

前几天,我和女朋友一起看温迪·威廉姆斯(Wendy Williams)的节目,当主持人建议她的观众每月至少删除一次浏览器历史记录时,我感到非常震惊。删除浏览器历史记录通常具有以下效果:

  1. 删除已访问网站的历史记录。
  2. 删除饼干和(哇人)。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-Modifiedheader告诉浏览器这个文件基本上从不被修改。 告诉代理和网关不要缓存文档,但告诉浏览器将其缓存1年。Cache-Control

下次浏览器请求文档时,它将发送和标头。我们可以使用它们来返回响应。If-Modified-SinceIf-None-Match304 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.js304 Not Modifiedtracking.js

我仍然不明白。向我解释

假设用户清除了其浏览历史记录并刷新了页面。用户计算机上唯一剩下的是浏览器缓存中的副本。当浏览器请求时,它会收到一个响应,导致它执行它收到的第一个版本。 执行并还原已删除的。tracking.jstracking.js304 Not Modifiedtracking.jstracking.jsSessionID

验证

假设 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; 

现在,为了使哈克索的攻击起作用,他们必须:

  1. 有相同的.这意味着他们必须拥有与受害者相同的ISP提供商(Tricky)。这将使我们的受害者有机会在自己的国家采取法律行动。Haxor 还必须从受害者处获取 HTTPS 会话密钥 (Hard)。ComputerID
  2. 有相同的.任何人都可以欺骗用户代理字符串(烦人)。BrowserID
  3. 能够创建自己的假货(非常困难)。卷 atacks 不起作用,因为我们使用时间戳来生成加密/签名密钥,所以基本上它就像为每个会话生成一个新密钥一样。最重要的是,我们加密随机字节,因此简单的字典攻击也是不可能的。SessionID

我们可以通过转发和(通过ajax或隐藏字段)并与它们进行匹配来改善验证。GoogleIDFingerprintID

if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;

答案 2

这些人开发了一种指纹识别方法,用于以高精度识别用户:

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%。

我们讨论了浏览器指纹识别在实践中构成的隐私威胁,以及哪些对策可能适合于防止它。在可指纹识别性和某些类型的可调试性之间存在权衡,这在当前的浏览器中严重违反隐私。矛盾的是,如果足够多的人没有使用反指纹隐私技术,它们可能会弄巧成拙;我们表明,一些隐私措施目前成为这一悖论的受害者,但其他隐私措施则不然......