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

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

因为我想要解决scheme在所有机器和所有浏览器上工作(在合理的范围内),我正在尝试使用javascript创build一个解决scheme。

我感谢帮助。 谢谢。

编辑:

Cookies不会。

我需要能够基本上创build一个独特的计算机和可重复的GUID,假设没有发生硬件变化的计算机。 我正在考虑的方向是获得网卡的MAC和这种性质的其他信息,这将使机器访问该网站。

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

browser-uniqueness.pdf

有可能使用Flash cookies :

  • 无处不在的可用性(95%的访客可能会有闪光灯)
  • 您可以存储更多的数据每个cookie(高达100 KB)
  • 跨浏览器共享,所以更可能唯一标识一台机器
  • 清除浏览器cookie不会删除闪存cookie。

你需要build立一个小的(隐藏的)Flash电影来读写它们。

无论您select哪条路线,都要确保您的用户selectIN进行跟踪,否则您侵犯了他们的隐私并成为坏人之一。

没有所有者的合作,不可能识别访问网站的计算机。 但是,如果他们让您访问您的网站,则可以存储Cookie以识别该计算机。 关键是,访客是在控制; 他们可以删除cookie,并随时显示为新访客。

你可能想尝试在evercookie中设置一个唯一的ID(它可以跨浏览器,查看他们的常见问题): http ://samy.pl/evercookie/

还有一家名为ThreatMetrix的公司,被很多大公司用来解决这个问题: http ://threatmetrix.com/our-solutions/solutions-by-product/trustdefender-id/它们相当昂贵,他们的其他产品不是很好,但他们的设备ID很好。

最后,这个开源的jQuery实现panopticlick的想法: https : //github.com/carlo/jquery-browser-fingerprint它现在看起来很棒,但可以扩展。

希望能帮助到你!

在这篇科学文章中描述了一种被称为帆布指纹的stream行方法: Web永不遗忘:在野外的持续跟踪机制 。 一旦你开始寻找它,你会惊讶它使用的频率。 该方法创build一个独特的指纹,这是每个浏览器/硬件组合一致。

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

关于canvas指纹的更多信息:

只有less量的信息可以通过HTTP连接获得。

  1. IP–但正如其他人所说,由于ISP的dynamic分配政策,这对于许多互联网用户来说并不是固定的。

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

  3. 请求字段的集合 – 每个请求都有其他字段,例如支持的编码等。这些(如果在聚合中使用的话)可以帮助识别用户的机器,但又依赖于浏览器并且可以改变。

  4. Cookies – 设置cookie是识别机器的另一种方式,或者更确切地说是一台机器上的浏览器,但正如其他人所说的那样,这些可以被用户删除或closures,只适用于浏览器,而不是机。

所以,正确的答案是,你不能通过单独的HTTP over IP协议来实现你将要实现的function。 但是,使用Cookie和IP以及HTTP请求中的字段的组合,您很有可能猜测它是什么机器。 用户往往只使用一个浏览器,而且往往是从一台机器,所以这可能是相当的缓解,但这将取决于观众…技术人员更可能混乱这个东西,并使用更多的机器/浏览器。 此外,这甚至可能与一些尝试对IP进行地理定位并使用该数据的尝试结合在一起。 但是无论如何,没有任何解决scheme在任何时候都是正确的。

存在Cookie和非Cookie方法的缺陷。 但是,如果你可以原谅cookies方法的缺点,这是一个想法。

如果您已经在您的网站上使用Google Analytics(分析),则无需编写代码即可自行跟踪唯一身份用户。 Google Analytics(分析)通过__utma cookie值为您提供__utma ,如Google文档中所述 。 通过重复使用这个值,你不会创build额外的cookie有效载荷,这对页面请求有效。

而且您可以轻松地编写一些代码来访问该值,或者使用此脚本的 getUniqueId()函数。

与以前的解决scheme一样,cookie是一个好方法,但请注意,它们确定浏览器 。 如果我在Firefox中访问了一个网站,那么在Internet Explorer中,cookies将被单独存储。 一些用户也禁用cookie(但更多的人禁用JavaScript)。

另一种考虑的方法是IP和主机名识别(注意这些对于拨号/非静态IP用户可能不同,AOL也使用IP地址)。 但是,由于这只能识别networking,因此这可能不如Cookie。

关于使用cookie的build议,唯一全面的可用于询问的标识属性包含在HTTP请求头中。 所以有可能使用这些的一些子集来为用户代理(即浏览器)创build伪唯一标识符。 此外,大部分信息可能已经被默认logging在您的networking服务器软件的“访问日志”中,如果没有,可以很容易地configuration为这样做。 然后,可以开发一个简单的扫描这个日志的内容,创build由IP地址和用户代理string等组成的每个请求的指纹 。更多的数据,甚至包括特定的cookies的内容,增加到这个指纹的独特性的质量。 尽pipe如其他许多人已经说过的那样,HTTP协议并没有使这个100%的万无一失 – 最多只能是一个相当好的指标。

介绍

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

  • 您将需要在用户计算机上保存数据。 这些数据可以随时被用户删除。 除非你有办法重新创build这个数据,每个机器都是独一无二的,那么你的卡住了。
  • validation。 您需要防范欺骗,会话劫持等

即使有方法可以在不使用cookies的情况下跟踪计算机,总会有一种方法可以绕过它,而软件会自动执行此操作。 如果你真的需要跟踪一些基于计算机的东西,你将不得不编写一个本地应用程序(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. 对于已login的用户,您始终可以通过用户username / password / email生成相同的会话ID。
  2. 您仍然可以使用sessionID跟踪访客用户。
  3. 即使几个人使用同一台计算机(即网吧),如果他们login,你可以分别跟踪他们。

基于会话的跟踪的缺点:

  1. 会话是基于浏览器的,而不是基于计算机的。 如果用户使用2个不同的浏览器,则会导致2个不同的会话。 如果这是一个问题,你可以停止阅读这里。
  2. 会话过期,如果用户没有login。如果用户没有login,那么他们将使用访客会话,如果用户删除Cookie和浏览器caching将被无效。

履行

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

基本

我将使用所谓的永久cookie来跟踪会话。 即使用户删除了他的cookies或更新他的浏览器,这也是自动重新创build的数据。 它不会在用户删除他们的Cookie和他们的浏览caching中生存。

为了实现这一点,我将使用浏览器caching机制( RFC ),WebStorage API( MDN )和浏览器Cookie( RFC , Google Analytics )。

法律

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

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

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

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

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

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

和缺点:

  1. 数据必须经过encryption/解密和签名/validation,从而在客户端(不是很糟糕)和服务器(b!)上创buildCPU开销。
  2. 用户删除Cookie和caching后,数据将被删除。 (这是我真正想要的)
  3. 用户离线时数据不可用于分析。 (仅针对当前浏览用户的分析)

的UUID

  • BrowserID :从浏览器用户代理string生成的唯一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

机制

有一天,我和女朋友一起看着温迪·威廉姆斯的节目 ,当主持人build议她的观众每个月至less删除一次浏览器的历史logging时,他感到非常震惊。 通常删除浏览器历史logging具有以下效果:

  1. 删除访问过的网站的历史logging。
  2. 删除cookies和window.localStorage (aww人)。

大多数现代浏览器使这个选项随时可用,但不要害怕朋友。 有一个解决scheme。 浏览器有一个caching机制来存储脚本/图像和其他东西。 通常,即使我们删除了我们的历史,这个浏览器caching仍然存在。 我们所需要的是一种在这里存储数据的方法。 有两种方法可以做到这一点。 更好的方法是使用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") || ""

如何让track.js在浏览器中保持不变?

我们可以使用Cache-Control , Last-Modified和ETag 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告诉代理和网关不要caching文档,而是告诉浏览器caching1年。

浏览器下一次请求文档时,它将发送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的本地副本。

我还是不明白。 给我解释

让我们假设用户清除浏览logging并刷新页面。 用户计算机上剩下的唯一东西就是浏览器caching中的tracking.js副本。 当浏览器请求tracking.js时,它会收到一个304 Not Modified响应,导致它执行它接收到的第一个tracking.js版本。 tracking.js执行并恢复被删除的SessionID

validation

假设Haxor X在他们仍然login的情况下窃取了我们的客户的cookies。我们如何保护他们? 密码学和浏览器指纹识别来拯救。 请记住我们对于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)

现在我们可以使用以下algorithmvalidation我们的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; 

现在为了让哈克斯的攻击行动起来,他们必须:

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

我们可以通过转发GoogleIDFingerprintID (通过ajax或隐藏字段)并GoogleID匹配来改进validation。

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

当我使用一台从未访问我的网上银行网站的机器时,我被要求额外的authentication。 那么,如果我第二次回到网上银行网站,我不会被要求额外的authentication…我删除了所有在IE浏览器中的cookies,并在我的网上银行网站上滔滔不绝地期待再次被问及authentication问题。 令我惊讶的是我没有被问到。 这是否导致人们相信银行正在做一些不涉及cookies的电脑标签?

这是银行使用的一种相当常见的authentication方式。

假设您通过example-isp.com访问您的银行网站。 您第一次来到这里时,系统会要求您提供密码以及其他身份validation。 一旦你通过,银行知道用户“thatisvaliant”进行身份validation访问该网站通过example-isp.com。

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

因此,总结一下,根据您的IP地址,银行识别的是您的ISP和/或networking阻止。 显然,您的ISP并不是每个用户都是您,这就是为什么银行仍然要求您input密码的原因。

你曾经有一个信用卡公司的电话,以确认事情没有问题,当你在不同的国家使用信用卡? 相同的概念。

真的,你想做的事不能做,因为协议不允许这样做。 如果静态的IP被普遍使用,那么你可以做到这一点。 他们不是,所以你不能。

如果你真的想识别 ,让他们login。

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

只要他们已经login了,而且你正在通过cookies / link-parameters / beacons / cookies在你的站点内跟踪他们的会话,你可以确信他们在那段时间使用的是同一台计算机。

最后,如果你的用户没有使用你自己的本地networking,并且没有静态IP地址,那么说这告诉你他们正在使用哪台计算机是不正确的。

如果你想做的事情是在用户的合作下完成的,而且每个cookie只有一个用户,并且他们只使用一个web浏览器,那么就使用一个cookie。

Cookie不会用于确定唯一身份访问者。 用户可以清除Cookies并刷新网站 – 然后他又被归类为新用户。

我认为要做到这一点的最好方法是实现一个服务器端解决scheme(因为您将需要某处存储您的数据)。 根据您对这些数据的需求的复杂程度,您将需要确定什么被归类为独特的访问。 一个明智的方法是允许一个IP地址在第二天返回,并给予一个独特的访问。 来自一个IP地址的一次访问不应被视为唯一。

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

服务器端解决scheme将在所有机器上工作,因为您将在首次加载站点时跟踪用户。 不要使用JavaScript,因为这是用于客户端脚本,再加上用户可能已经禁用它在任何情况下。

希望有所帮助。

因为我想要解决scheme在所有机器和所有浏览器上工作(在合理的范围内),我正在尝试使用javascript创build一个解决scheme。

这不是一个真正的理由使用JavaScript?

正如其他人所说 – cookies可能是你最好的select – 只是要知道的限制。

我想cookies可能是你正在寻找; 这是大多数网站如何唯一标识访问者。

我想判决是我不能以编程方式唯一标识正在访问我的网站的计算机。

我有以下问题。 当我使用一台从未访问我的网上银行网站的机器时,我被要求额外的authentication。 那么,如果我第二次回到网上银行网站,我不会被要求额外的authentication。 阅读我的问题的答案我决定它必须是一个涉及的cookie。 因此,我删除了IE浏览器中的所有cookies,并将其重新login到我的网上银行网站,完全期望再次被问及authentication问题。 令我惊讶的是我没有被问到。 这是否导致人们相信银行正在做一些不涉及cookies的电脑标签?

更进一步,经过大量的谷歌search今天我发现以下公司谁声称出售一个解决scheme,唯一确定访问一个网站的机器。 http://www.the41.com/products.asp

我欣赏所有的好消息,如果你能进一步澄清这个矛盾的信息,我发现我将不胜感激。

我会做这个使用cookies和闪存cookies的组合。 创build一个GUID并将其存储在一个cookie中。 如果cookie不存在,请尝试从flash cookie中读取它。 如果仍然没有find,请创build它并将其写入Flash cookie。 这样你就可以跨浏览器共享相同的GUID。

假设你不想让用户控制,你不能。 networking不能这样工作,最好的希望是一些启发式的。

如果这是一个强制访问者安装某些软件并使用TCPA的选项,那么您可能会将某些东西closures。

我的文章可能不是一个解决scheme,但我可以提供一个例子,这个function已经实现。

如果您第一次从您的计算机访问www.supertorrents.org的注册页面,那很好。 但是,如果您刷新页面或再次打开页面,则表示您以前访问过该页面。 真正的美在这里 – 它确定,即使你重新安装Windows或其他操作系统。

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

我肯定会分享,如果我find如何做到这一点。

一个恶作剧:

  1. 创build2个注册页面:

    首先注册页面:没有任何电子邮件或安全检查(只需用户名和密码)

    第二注册页面:安全级别高(邮件validation请求和安全图片等)

  2. 为了客户的满意和便于注册,默认注册页面应该是(First Registration Page),但是在(First Registration Page)页面中有一个隐藏的限制。 这是IP限制。 如果IP试图第二次注册(例如less于1小时)而不是显示块页面。 您可以自动显示(第二注册页面)

  3. (首次注册页面)中,您可以设置(例如:从1个IP只有1小时或24小时的2次尝试),并且在(例如)1小时之后,您可以自动从该IP开放访问

请注意:( 第一注册页面)(第二注册页面)不应该分隔开。 你只做1页。 (例如:register.php),并在第一个PHP风格和第二个PHP风格之间切换