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

时间:2008-10-19 15:34:21

标签: javascript cookies browser

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

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

我很感激帮助。感谢。

编辑:

Cookies不行。

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

22 个答案:

答案 0 :(得分:54)

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

https://panopticlick.eff.org/static/browser-uniqueness.pdf

  

我们调查现代网络浏览器的程度   通过他们将根据要求传输到网站的版本和配置信息进行“设备指纹识别”。我们   实现了一种可能的指纹识别算法,并收集了这些算法   来自访问我们测试方的大量浏览器的指纹,   panopticlick.eff.org。我们观察到手指的分布 -   print包含至少18.1位的熵,这意味着如果我们选择一个   随机浏览器,充其量我们预计只有286,777其他一个   浏览器将共享其指纹。在支持Flash的浏览器中   或Java,情况更糟,平均浏览器至少携带   18.8位识别信息。 94.2%的浏览器使用Flash或Java   在我们的样本中是独一无二的。

     

通过观察回访者,我们估计浏览器指纹可能会随着时间的推移而快速变化。在我们的样本中,指纹变化很大   快速,但即使是一个简单的启发式通常能够猜测指纹何时是以前观察到的浏览器的“升级”版本   指纹,99.1%的猜测是正确的,只有假阳性率   0.86%。

     

我们讨论了隐私威胁浏览器指纹识别在实践中的作用,   什么对策可能适合防止它。有一个   在防止指纹可分性和某些类型的保护之间进行权衡   可调试性,在当前浏览器中严重加权隐私。矛盾的是,反指纹识别隐私技术可以是自我   如果没有足够数量的人使用它们就会失败;我们表明   一些隐私措施目前成为这个悖论的牺牲品,但是   别人不......

答案 1 :(得分:31)

如果没有所有者的合作,就无法识别访问网站的计算机。但是,如果他们允许您,则可以存储Cookie以在再次访问您的网站时识别该计算机。关键是,访客处于控制之中;他们可以删除cookie并随时显示为新访问者。

答案 2 :(得分:30)

简介

我不知道是否有办法单独使用浏览器来识别机器。主要原因是:

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

即使有办法在不使用cookie的情况下跟踪计算机,总会有一种方法可以绕过它并自动执行此操作的软件。如果您确实需要基于计算机跟踪某些内容,则必须编写本机应用程序(Apple Store / Android Store / Windows Program / etc)。

我可能无法回答您提出的问题,但我可以向您展示如何实施会话跟踪。通过会话跟踪,您可以尝试跟踪浏览会话,而不是访问您网站的计算机。通过跟踪会话,您的数据库架构将如下所示:

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. 对于已登录的用户,您始终可以从用户username / password / email生成相同的会话ID。
  2. 您仍然可以使用sessionID跟踪访客用户。
  3. 即使有几个人使用同一台计算机(即网吧),您也可以在登录时单独跟踪它们。
  4. 基于会话的跟踪的缺点:

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

      有很多方法可以实现这一点。我不认为我可以覆盖他们所有我只是列出我最喜欢的,这将使这个自以为是的答案。牢记这一点。

      基本

      我将使用所谓的永久cookie来跟踪会话。即使用户删除了他的cookie或更新了他的浏览器,这也是自动重建的数据。但是,如果用户删除了Cookie和浏览缓存,它将无法生存。

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

      法律

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

      • _ga :Google Analytics数据
      • __ utma :Google Analytics跟踪Cookie
      • sid :SessionID

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

      我在哪里存储会话数据?

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

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

        1. 数据必须加密/解密并签名/验证,这会在客户端(不是那么糟糕)和服务器(bah!)上创建cpu开销。
        2. 当用户删除其Cookie和缓存时,将删除数据。 (这就是我想要的)
        3. 当用户离线时,数据无法进行分析。 (仅针对当前浏览用户的分析)
        4. 的UUID

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

          机制

          前几天我和女朋友一起看wendy williams show,当主持人建议观众每月至少删除一次浏览器历史记录时,我感到非常恐惧。删除浏览器历史记录通常具有以下效果:

          1. 删除已访问网站的历史记录。
          2. 删除Cookie和window.localStorage(哇男)。
          3. 大多数现代浏览器都可以随时使用此选项,但不要担心朋友。因为有一个解决方案。浏览器有一个缓存机制来存储脚本/图像和其他东西。通常,即使我们删除了历史记录,此浏览器缓存仍然存在。我们所需要的只是一种在这里存储数据的方法。有两种方法可以做到这一点。更好的方法是使用SVG图像并将我们的数据存储在其标签中。这样,即使使用闪存禁用JavaScript,仍然可以提取数据。但是,由于这有点复杂,我将演示使用JSONP(Wikipedia

            的另一种方法

            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标头实现此目的。我们可以使用SessionID作为etag标题的值:

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

            Last-Modified标题告诉浏览器该文件基本上从未被修改过。 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.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(decrypt(getRandomBytes($sid)), getSignature($sid), $hk) ) return false;
            
            return true; 
            

            现在为了使Haxor的攻击能够发挥作用,他们必须:

            1. 拥有相同的ComputerID。这意味着他们必须拥有与受害者相同的ISP提供商(Tricky)。这将使我们的受害者有机会在自己的国家采取法律行动。 Haxor还必须从受害者(硬)获取HTTPS会话密钥。
            2. 拥有相同的BrowserID。任何人都可以欺骗用户代理字符串(恼人的)。
            3. 能够创建自己的假SessionID(非常难)。 Volume atacks不起作用,因为我们使用时间戳来生成加密/签名密钥,所以基本上就像为每个会话生成一个新密钥。最重要的是,我们加密随机字节,因此简单的字典攻击也是不可能的。
            4. 我们可以通过转发GoogleIDFingerprintID(通过ajax或隐藏字段)并与之匹配来改进验证。

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

答案 3 :(得分:30)

有可能使用flash cookies

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

你需要制作一个小的(隐藏的)flash电影来读写它们。

无论您选择哪条路线,请确保您的用户选择加入跟踪,否则您将侵犯他们的隐私并成为其中一个坏人。

答案 4 :(得分:21)

您可能想尝试在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 它看起来现在已经很半融,但可以扩展。

希望它有所帮助!

答案 5 :(得分:20)

这种科学文章中描述了一种称为画布指纹的流行方法:The Web Never Forgets: Persistent Tracking Mechanisms in the Wild。一旦你开始寻找它,你会惊讶于它的使用频率。该方法创建唯一的指纹,该指纹对于每个浏览器/硬件组合都是一致的。

本文还介绍了其他持久性跟踪方法,如evercookies,重新生成http和Flash Cookie以及Cookie同步。

有关画布指纹识别的更多信息:

答案 6 :(得分:10)

您只能通过HTTP连接获得少量信息。

  1. IP - 但正如其他人所说,由于其ISP的动态分配政策,如果不是大多数互联网用户,这并不是固定的。

  2. Useragent String - 几乎所有浏览器都会在每次请求时发送它们所使用的浏览器类型。但是,这可以由用户在今天的许多浏览器中设置。

  3. 请求字段的集合 - 每个请求都会发送其他字段,例如支持的编码等。如果在聚合中使用这些字段可以帮助识别用户的计算机,但同样取决于浏览器,可以是改变。

  4. Cookie - 设置Cookie是识别计算机的另一种方式,或者更具体地说是计算机上的浏览器,但正如其他人所说,这些可以被用户删除或关闭,并且仅适用在浏览器上,而不是机器上。

  5. 因此,正确的回答是,您无法单独通过HTTP over IP协议实现您的生活。但是,使用cookie,IP以及HTTP请求中的字段的组合,您很有可能猜测,排序,它是什么机器。用户倾向于只使用一个浏览器,并且通常来自一台机器,因此这可能相当可靠,但这取决于受众......技术人员更容易弄乱这些东西,并使用更多的机器/浏览器。此外,这甚至可以与一些地理定位IP的尝试相结合,并使用该数据。但无论如何,没有任何解决办法在任何时候都是正确的。

答案 7 :(得分:9)

存在cookie和非cookie方法的缺陷。但是如果你能原谅cookie方法的缺点,这就是一个想法。

如果您已经在自己的网站上使用Google Analytics,那么您无需编写代码来自行跟踪唯一身份用户。 Google Analytics(分析)会通过__utma Cookie值为您执行此操作,如Google's documentation中所述。通过重用此值,您不会创建额外的cookie有效负载,这可以提高页面请求的效率。

您可以轻松编写一些代码来访问该值,或使用this script's getUniqueId()函数。

答案 8 :(得分:8)

与之前的解决方案一样,Cookie是一种很好的方法,请注意它们识别浏览器。如果我访问了Firefox中的某个网站,然后在Internet Explorer中,将单独存储两个尝试的cookie。有些用户还禁用了cookie(但更多人禁用了JavaScript)。

另一种需要考虑的方法是I.P.和主机名识别(请注意,拨号/非静态IP用户可能会有所不同,AOL也使用一揽子IP)。但是,由于这只能识别网络,因此可能无法像cookie一样工作。

答案 9 :(得分:6)

  

当我使用从未访问过我的网上银行网站的机器时,我会被要求进行额外的身份验证。然后,如果我第二次回到网上银行网站,我不会被问到额外的身份验证...我删除了IE中的所有cookie并重新登录到我的网上银行网站,完全期望再次被问到身份验证问题。令我惊讶的是我没有被问到。这不会让人相信银行正在做某种不涉及cookie的电脑标签吗?

这是银行使用的一种非常常见的身份验证类型。

假设您通过example-isp.com访问您的银行网站。您第一次来到那里时,系统会要求您输入密码以及其他身份验证。一旦您通过,银行就会知道用户“thatisvaliant”已经过身份验证,可通过example-isp.com访问该网站。

将来,当您通过example-isp.com访问该网站时,它不会要求额外的身份验证(超出您的密码)。如果您尝试通过another-isp.com访问银行,银行将再次执行相同的例程。

总而言之,根据您的IP地址,银行识别的是您的ISP和/或网络块。显然,并非ISP的每个用户都是您,这就是银行仍然要求您提供密码的原因。

当您在其他国家/地区使用信用卡时,您是否曾接到信用卡公司电话以确认一切正常?同样的概念。

答案 10 :(得分:6)

除了使用cookie的建议之外,查询可用的唯一全面的标识属性包含在HTTP请求标头中。因此,可以使用这些的一些子集来为用户代理(即,浏览器)创建伪唯一标识符。此外,大多数此类信息可能已默认记录在Web服务器软件的所谓“访问日志”中,如果没有,则可以轻松配置为这样做。然后,可以开发一个只扫描此日志内容的创建,创建每个请求的指纹,例如IP地址和用户代理字符串等。可用的数据越多,甚至包括特定cookie的内容,增加了此指纹唯一性的质量。虽然,正如许多其他人已经说过的那样,HTTP协议并没有使这100%万无一失 - 充其量它只能是一个相当好的指标。

答案 11 :(得分:4)

真的,你想做的事情无法完成,因为协议不允许这样做。如果普遍使用静态IP,那么您可以这样做。他们不是,所以你不能。

如果您确实要识别,请让他们登录。

由于它们可能会移动到您网站上的不同页面,因此您需要一种方法来跟踪它们的移动情况。

只要他们已登录,并且您通过cookies / link-parameters / beacons /等跟踪他们在您网站内的会话,您就可以非常确定他们在此期间使用的是同一台计算机。

最终,如果您的用户没有使用您自己的本地网络并且没有静态IP地址,则告诉您他们正在使用哪台计算机是不正确的。

如果您想要做的是与用户的合作完成,并且每个cookie只有一个用户并且他们使用单个Web浏览器,则只需使用cookie。

答案 12 :(得分:3)

  

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

使用javascript不是一个非常好的理由吗?

正如其他人所说 - 饼干可能是你最好的选择 - 只要注意这些限制。

答案 13 :(得分:3)

Cookie对于确定唯一身份访问者没有用。用户可以清除cookie并刷新网站 - 然后他再次被归类为新用户。

我认为最好的方法是实现服务器端解决方案(因为您需要在某处存储数据)。根据您对此类数据的需求的复杂程度,您需要确定哪些被归类为唯一访问。一种明智的方法是允许IP地址在第二天返回并进行唯一访问。一天内从一个IP地址进行的几次访问不应被视为唯一身份。

例如,使用PHP,获取访问者的IP地址并将其存储在文本文件(或sql数据库)中是微不足道的。

服务器端解决方案适用于所有计算机,因为您将在首次加载站点时跟踪用户。不要使用javascript,因为它适用于客户端脚本,而且用户可能在任何情况下都禁用它。

希望有所帮助。

答案 14 :(得分:2)

我会使用Cookie和Flash Cookie的组合来完成此操作。创建GUID并将其存储在cookie中。如果cookie不存在,请尝试从Flash cookie中读取它。如果仍未找到它,请创建它并将其写入闪存cookie。这样,您可以跨浏览器共享相同的GUID。

答案 15 :(得分:2)

我想判决结果是我无法以编程方式唯一地识别访问我网站的计算机。

我有以下问题。当我使用从未访问过我的网上银行网站的机器时,我会被要求进行额外的身份验证。然后,如果我第二次回到网上银行网站,我不会被问到额外的身份验证。阅读我的问题的答案我决定它必须是一个cookie。因此,我删除了IE中的所有cookie并重新登录到我的网上银行网站,完全期望再次被问到身份验证问题。令我惊讶的是我没有被问到。这不会让人相信银行正在做某种不涉及cookie的电脑标签吗?

此外,在今天进行了大量谷歌搜索后,我发现以下公司声称销售的解决方案可以唯一识别访问网站的机器。 http://www.the41.com/products.asp

如果您能够进一步澄清这些相互矛盾的信息,我会非常感谢所有这些信息,我会非常感激。

答案 16 :(得分:1)

我认为饼干可能就是你想要的;这就是大多数网站唯一识别访客的方式。

答案 17 :(得分:1)

您可以使用fingerprintjs2

new Fingerprint2().get(function(result, components) {
  console.log(result) // a hash, representing your device fingerprint
  console.log(components) // an array of FP components
  //submit hash and JSON object to the server 
})

之后,您可以针对现有用户检查所有用户并检查JSON相似性,因此即使他们的指纹发生变异,您仍然可以跟踪它们

答案 18 :(得分:0)

假设您不希望用户处于控制之中,则不能。网络不能像那样工作,你可以期待的最好的是一些启发式。

如果可以选择强制访问者安装某些软件并使用TCPA,那么您可以选择关闭。

答案 19 :(得分:0)

我的帖子可能不是解决方案,但我可以提供一个示例,其中已实现此功能。

如果您是第一次从计算机访问www.supertorrents.org的注册页面,那很好。但是,如果您刷新页面或再次打开页面,它会识别您之前访问过的页面。真正的美丽来到这里 - 即使您重新安装Windows或其他操作系统,它也能识别出来。

我在某处读到了存储CPU ID的地方。虽然我找不到他们是怎么做的,但我很怀疑它,他们可能会使用MAC地址来做。

如果我发现如何,我肯定会分享。

答案 20 :(得分:0)

诀窍:

  1. 创建2个注册页面:

    首次注册页面,不进行任何电子邮件或安全检查(仅使用用户名和密码)

    具有高安全级别的第二个注册页面(电子邮件验证请求和安全图像等)

  2. 为了客户满意,轻松注册,默认 注册页面应该是(首次注册页面)但是在 (首次注册页面)存在隐藏限制。这是IP 限制。如果IP试图第二次注册(例如不到1小时)而不是 显示阻止页面。您可以显示(第二个注册页面) 自动

  3. 您可以设置(首次注册页面)
  4. (例如:第2块 从1 ip尝试1小时或24小时)和之后(例如)1小时,您可以自动从该IP打开访问
  5. 请注意:(首次注册页面)(第二次注册页面)不应位于单独的页面中。你只做了1页。 (例如:register.php)并使其在第一个PHP样式和第二个PHP样式之间切换是明智的

答案 21 :(得分:0)

我将给出我的想法,从简单到复杂。 在上述所有内容中,您可以创建会话,问题本质上转化为将会话与请求匹配。

a)(难度:简单)使用客户端硬件显式存储某种会话 ID/哈希(存在相当多的隐私/安全问题,因此请确保对存储的任何内容进行哈希处理),解决方案包括:

  • cookies 存储
  • 浏览器存储/webDB/(更奇特的浏览器解决方案)
  • 具有将内容存储在文件中的权限的扩展程序。

上面的问题是用户可以在不想要的情况下清空他的缓存。

b)(难度:中等)基于登录的身份验证。 大多数现代 Web 框架都提供了这样的解决方案,其核心思想是让用户自愿识别自己的身份,这很直接,但会增加架构的复杂性。

上述内容受到额外的复杂性和基本上非公开的内容的影响。

c)(难度:hard -R&D)基于元数据的识别,(浏览器 IP/语言/浏览器/和其他隐私入侵的东西,所以确保你让你的用户知道,否则你可能会被起诉) 不完美的解决方案可能会变得更加复杂(用户以特定频率打字或使用具有特定模式的鼠标?您甚至应用 ML 解决方案)。 要求保护的解决方案

最强大的,因为用户甚至不需要明确地识别他。这是对隐私的直接侵犯(参见 GDPR),并不完美,例如。 ip可以改。