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

IT技术 javascript cookies browser
2021-01-19 07:04:41

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

因为我希望该解决方案适用于所有机器和所有浏览器(在合理范围内),所以我正在尝试使用 javascript 创建一个解决方案。

饼干不行。

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

6个回答

介绍

我不知道是否有或将有一种方法可以单独使用浏览器来唯一标识机器。主要原因是:

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

即使有办法在不使用 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 username/ password/ email
  2. 您仍然可以使用sessionID.
  3. 即使多人使用同一台计算机(即网吧),如果他们登录,您也可以分别跟踪他们。

基于会话的跟踪的缺点:

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

执行

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

基本

我将使用所谓的永久 cookie 来跟踪会话。即使用户删除了他的 cookie 或更新了他的浏览器,这些数据也会自动重新创建。然而,它不会在用户删除他们的 cookie 和他们的浏览缓存后继续存在。

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

合法的

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

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

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

我在哪里存储我的会话数据?

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

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

和缺点:

  1. 数据必须加密/解密和签名/验证,这会在客户端(还不错)和服务器(呸!)上产生 CPU 开销。
  2. 当用户删除他们的 cookie 和缓存时,数据将被删除。(这才是我真正想要的)
  3. 当用户离线时,数据无法用于分析。(仅针对当前浏览用户的分析)

UUIDS

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

机制

有一天,我和我的女朋友一起看wendy williams 的节目,当主持人建议她的观众至少每月删除一次浏览器历史记录时,我感到非常震惊。删除浏览器历史记录通常有以下效果:

  1. 删除访问过的网站的历史记录。
  2. 删除 cookie 和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-ControlLast-ModifiedETag HTTP 标头来实现这一点我们可以使用SessionIDetag 标头as 值:

setHeaders({
  "ETag": SessionID,
  "Last-Modified": new Date(0).toUTCString(),
  "Cache-Control": "private, max-age=31536000, s-max-age=31536000, must-revalidate"
})

Last-Modifiedheader 告诉浏览器这个文件基本上不会被修改。Cache-Control告诉代理和网关不要缓存文档,而是告诉浏览器将其缓存 1 年。

下次浏览器请求文档时,它将发送If-Modified-SinceIf-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.js304 Not Modifiedtracking.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 的攻击起作用,他们必须:

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

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

if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;
另外,我想知道是否有高级版本可以简单地使用缓存的 tracking.js 文件(或多个此类文件)将其用作本质上的 localStorage/cookies,即记住大量数据。这个想法是让一个库拥有像storageFacade.setItemstorageFacade.getItem . And it tries to use localStorage, but fallsback to your technique when disabled. ..Perhaps the way it works is via a single file for "diffs" i.e. each time you call setItem . And then a manifest` 之类的方法,这些方法是在会话期间创建的所有差异,每隔一段时间自动创建一次。
2021-03-14 07:04:41
顺便说一句,这是一个漂亮的答案。这么多信息。我很惊讶你没有更多的赞成票。老实说,我无法相信使用 svgs 和 jsonp 的技术存在,但它必须存在。当 cookie/localStorage/sessionStorage 被禁用时,是否没有库可以回退到这种技术?
2021-03-24 07:04:41
@faceyspacey.com 对不起,从来没有图书馆。您必须编写代码并不断更新您自己的自定义解决方案。想想看。一旦你为此开发了一个库,所有添加的拦截器/浏览器/等都会立即反击它。这样做的唯一原因是因为它依赖于一个非常重要的核心浏览器功能,它们根本不会删除/禁用:缓存。我不断丢失我的登录名和密码。而且由于我不再问很多问题,我不需要回答很多问题,这样我就可以留下声誉的赏金。我刚刚看到这个并意识到没有真正的答案。
2021-03-24 07:04:41
如果清单只是每隔一段时间创建一次,本质上它会限制创建的清单数量。然后在 javascript 中,您可以尝试请求创建的所有可能的清单,然后使用最新的清单从差异快照重建状态。如果我们只有差异,可能会有成百上千个差异,这可能是一个性能问题,试图获取它们直到一个失败。即,您以增量方式获取差异或清单:manifest-1.js、manifest-2.js 等,直到失败(因为它不存在)。这意味着您拥有所有清单(或差异)
2021-04-04 07:04:41

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

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”:D
2021-03-14 07:04:41
我是一名开发人员,我来这里是为了寻找快速解决方案或小代码片段。本文档没有展示如何实现它。我想知道如何实现这一点,以便我可以跟踪我网站的唯一用户。
2021-03-21 07:04:41
请在此处查看我的答案以获取开源包和实现指纹识别的简单方法stackoverflow.com/a/47536192/3650835
2021-03-22 07:04:41
@奥利弗你是对的。这不会在盘子上给你答案。它需要进一步阅读、理解所有涉及的问题以及为什么一个简单的代码片段不可能完全有效。一个有进取心的开发人员可能会编写一个库来完成所有艰苦的工作,并使寻求“快速解决方案”的人们在未来受益。
2021-04-01 07:04:41
答案也是仅链接。如果 PDF 变得不可用,将不胜感激 PDF 中描述的技术摘要。
2021-04-07 07:04:41

如果没有所有者的合作,就不可能识别访问网站的计算机。但是,如果他们允许,您可以存储一个 cookie 以在机器再次访问您的网站时识别该机器。关键是,访客在掌控;他们可以随时删除 cookie 并以新访客的身份出现。

如果他使用 3 个不同的浏览器访问您的网站,那么他将拥有 3 个不同的 cookie,因为 cookie 不会在应用程序之间共享。此外,如果他使用 DHCP 而不是静态 IP 地址,他的计算机可能不会长时间拥有相同的 IP 地址。
2021-03-31 07:04:41
是和否。浏览器指纹识别以很高的概率识别浏览器配置文件,但这不是本问题中寻求的绝对一对一识别。对于精明的用户来说,如果他们愿意,故意规避也是相当简单的(但也许并不容易)。
2021-03-31 07:04:41

一种可能性是使用flash cookie

  • 无处不在的可用性(95% 的访问者可能会使用闪存)
  • 您可以为每个 cookie 存储更多数据(最多 100 KB)
  • 跨浏览器共享,因此更有可能唯一标识一台机器
  • 清除浏览器 cookie 不会删除 flash cookie。

您需要构建一个小的(隐藏的)Flash 电影来读取和写入它们。

无论您选择什么路线,请确保您的用户选择加入被跟踪,否则您就是在侵犯他们的隐私并成为坏人之一。

在过去的九年里,情况发生了变化。如今,95% 的用户甚至不在桌面上,而且移动设备从未真正接受 Adob​​e Flash Player。
2021-03-15 07:04:41
许多用户使用 Flashblock。如果用户想看到它,只需单击一下即可激活 Flash。
2021-03-25 07:04:41
我认为这是最好的解决方案之一。Youtube、Google 等使用 LSO 来打击滥用行为。
2021-03-29 07:04:41
有一些方法可以删除 cookie,但它们超出了普通用户的范围。Adobe 网站上有一些页面可用于查看和删除 LSO(本地共享对象en.wikipedia.org/wiki/Local_Shared_Object),尽管对于 Firefox 用户来说,反对附加组件是删除它们的最简单方法
2021-04-08 07:04:41
Flash cookie 与现代版本的 Firefox 和 Chrome 中的 HTTP cookie 一样容易删除:维基百科Adobe announced that Flash Player 10.3 enables Mozilla Firefox 4 and "future releases of Apple Safari and Google Chrome" to delete local shared objects,[11] so since version 4, Firefox treats LSOs the same way as HTTP cookies - deletion rules that previously applied only to HTTP cookies now also apply to LSOs.
2021-04-09 07:04:41

您可能想尝试在 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 现在看起来还很成熟, 但可以扩展。

希望能帮助到你!

+ 1 - 布赖恩 - 很棒的信息!这一切都被证明非常有用。谢谢你。如果您没有学到更多,请添加更多信息。
2021-03-22 07:04:41
在 iOS Safari Private 模式和桌面 Chrome 隐身模式下尝试了示例页面,浏览器重启后无法检索 cookie。
2021-03-27 07:04:41
关于evercookie。尝试使用 Opera。设置 cookie,然后从 Opera 中删除所有历史记录,然后关闭 Opera,再次打开单击Click to rediscover cookies并查看 null 或 undefined。所以这对我不起作用
2021-04-04 07:04:41