我需要找出一种方法来唯一地识别访问我正在创建的网站的每台计算机.有没有人对如何实现这一点有任何建议?
因为我希望解决方案适用于所有机器和所有浏览器(在合理范围内),我正在尝试使用javascript创建解决方案.
我很感激帮助.谢谢.
编辑:
Cookies不行.
假设计算机没有发生硬件更改,我需要能够基本上创建一个计算机独有的guid并且可重复.我正在考虑的方向是获取网卡的MAC和这种性质的其他信息,这将是访问该网站的机器.
这些人开发了一种指纹识别方法,用于识别具有高精度的用户:
https://panopticlick.eff.org/static/browser-uniqueness.pdf
我们通过他们将根据请求传输到网站的版本和配置信息来调查现代Web浏览器受"设备指纹识别"的程度.我们实现了一种可能的指纹识别算法,并从访问我们测试端的大量浏览器中收集了这些指纹, panopticlick.eff.org.我们观察到指纹的分布包含至少18.1位的熵,这意味着如果我们随机选择一个浏览器,我们最多只能在286,777个其他浏览器中共享其指纹.在支持Flash或Java的浏览器中,情况更糟,平均浏览器携带至少18.8位的识别信息.在我们的示例中,94.2%的Flash或Java浏览器是唯一的.
通过观察回访者,我们估计浏览器指纹可能会随着时间的推移而快速变化.在我们的示例中,指纹变化非常快,但即使是简单的启发式算法通常能够猜测指纹是否是先前观察到的浏览器指纹的"升级"版本,99.1%的猜测是正确的,误报率仅为0.86% .
我们讨论了浏览器指纹识别在实践中构成的隐私威胁,以及可能采取哪些对策来防止它.在防止指纹可分性和某些类型的可调试性之间存在权衡,在当前浏览器中,这种可调试性在很大程度上取决于隐私.矛盾的是,如果没有足够数量的人使用,反指纹识别隐私技术可能会弄巧成拙; 我们表明,一些隐私措施目前成为这个悖论的受害者,但其他人并不......
我不知道是否存在或将来只能使用浏览器唯一识别机器的方法.主要原因是:
您需要在用户计算机上保存数据.用户可以随时删除此数据.除非你有办法重新创建这个数据,这对每台机器来说都是独一无二的.
验证.你需要防止欺骗,会话劫持等.
即使有办法在不使用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 }, ...]
基于会话的跟踪的优点:
对于登录用户,您始终可以从用户username
/ password
/ 生成相同的会话ID email
.
您仍然可以使用跟踪访客用户sessionID
.
即使有几个人使用同一台计算机(即网吧),如果他们登录,您也可以单独跟踪它们.
基于会话的跟踪的缺点:
会话是基于浏览器的,而不是基于计算机的.如果用户使用2个不同的浏览器,则会产生2个不同的会话.如果这是一个问题,你可以在这里停止阅读.
如果用户未登录,则会话过期.如果用户未登录,则他们将使用访客会话,如果用户删除cookie和浏览器缓存,该会话将失效.
有很多方法可以实现这一点.我不认为我可以覆盖他们所有我会列出我最喜欢的,这将使这个看法答案.记住这一点.
我将使用所谓的永久cookie来跟踪会话.即使用户删除了他的cookie或更新了他的浏览器,这也是自动重建的数据.然而,在用户删除其cookie和浏览缓存时,它将无法生存.
为了实现这一点,我将使用浏览器缓存机制(RFC),WebStorage API(MDN)和浏览器cookie(RFC,Google Analytics).
为了使用跟踪ID,您需要将其添加到您的隐私政策和使用条款中,最好是在子标题跟踪下.我们将使用在以下两个按键document.cookie
和 window.localStorage
:
_ga:Google Analytics数据
__utma:Google Analytics跟踪Cookie
sid:SessionID
确保在所有使用跟踪的网页上包含指向您的隐私权政策和使用条款的链接.
您可以将会话数据存储在网站数据库中或用户计算机上.由于我通常在使用第三方应用程序(Google Analytics/Clicky/etc)的小型网站(超过1万个连续连接)上工作,因此我最好将数据存储在客户端计算机上.这具有以下优点:
没有数据库查找/开销/负载/延迟/空间/等
用户可以随时删除他们的数据而无需给我写烦人的电子邮件.
和缺点:
必须对数据进行加密/解密和签名/验证,这会在客户端(不是那么糟糕)和服务器(bah!)上产生cpu开销.
当用户删除其cookie和缓存时,将删除数据.(这就是我想要的)
当用户离线时,数据无法进行分析.(仅针对当前浏览用户的分析)
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
有一天,我正和我女朋友一起观看温迪威廉姆斯秀,当主持人建议她的观众每月至少删除一次浏览器历史时,我感到非常震惊.删除浏览器历史通常具有以下效果:
删除已访问网站的历史记录.
删除cookie和window.localStorage
(哇男).
大多数现代浏览器都可以随时使用此选项,但不要担心朋友 因为有一个解决方案.浏览器有一个缓存机制来存储脚本/图像和其他东西.通常,即使我们删除了历史记录,此浏览器缓存仍然存在.我们所需要的只是一种在这里存储数据的方法.有两种方法可以做到这一点.更好的方法是使用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); }
现在我们可以随时获取会话密钥:
window.__sid || window.localStorage.getItem("sid") || getCookie("sid") || ""
如何让tracking.js在浏览器中粘贴?
我们可以使用Cache-Control,Last-Modified和ETag HTTP 头来实现这一点.我们可以使用SessionID
etag标头的as值:
setHeaders({ "ETag": SessionID, "Last-Modified": new Date(0).toUTCString(), "Cache-Control": "private, max-age=31536000, s-max-age=31536000, must-revalidate" })
Last-Modified
header告诉浏览器该文件基本上从未被修改过.Cache-Control
告诉代理和网关不要缓存文档,但告诉浏览器将其缓存1年.
下次浏览器请求文档时,它将发送If-Modified-Since
和If-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(getTimestamp($sid) + getBrowserID($sid) + getComputerID($sid) + decrypt(getRandomBytes($sid), hk), getSignature($sid), $hk) ) return false; return true;
现在为了使Haxor的攻击工作,他们必须:
有同样的ComputerID
.这意味着他们必须拥有与受害者相同的ISP提供商(Tricky).这将使我们的受害者有机会在自己的国家采取法律行动.Haxor还必须从受害者(硬)获取HTTPS会话密钥.
有同样的BrowserID
.任何人都可以欺骗用户代理字符串(恼人).
能够创造自己的假SessionID
(非常硬).Volume atacks不起作用,因为我们使用时间戳来生成加密/签名密钥,所以基本上就像为每个会话生成一个新密钥.最重要的是,我们加密随机字节,因此简单的字典攻击也是不可能的.
我们可以通过转发GoogleID
和FingerprintID
(通过ajax或隐藏字段)和匹配来改进验证.
if( GoogleID != getStoredGoodleID($sid) ) return false; if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;
没有所有者的合作,就无法识别访问网站的计算机.但是,如果他们允许您,则可以存储Cookie以便在计算机再次访问您的网站时识别该计算机.关键是,访客处于控制之中; 他们可以删除cookie并随时显示为新访问者.
可能是使用Flash Cookie:
无处不在的可用性(95%的访问者可能会有闪存)
您可以为每个cookie存储更多数据(最多100 KB)
跨浏览器共享,因此更有可能唯一地识别机器
清除浏览器cookie不会删除Flash Cookie.
你需要构建一个小的(隐藏的)flash电影来读写它们.
无论您选择哪种路线,请确保您的用户选择加入跟踪,否则您将侵犯他们的隐私并成为坏人之一.
您可能想尝试在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 它现在看起来相当一半,但可以扩展.
希望能帮助到你!
有一种流行的方法称为画布指纹识别,在这篇科学文章中描述:Web永不忘记:野外持久跟踪机制.一旦你开始寻找它,你会惊讶于它的使用频率.该方法创建唯一的指纹,该指纹对于每个浏览器/硬件组合是一致的.
本文还回顾了其他持久性跟踪方法,如evercookies,重生http和Flash cookie以及cookie同步.
有关canvas指纹的更多信息:
Pixel Perfect:HTML5中的指纹画布
https://en.wikipedia.org/wiki/Canvas_fingerprinting
您只能通过HTTP连接获得少量信息.
IP - 但正如其他人所说,由于其ISP的动态分配政策,如果不是大多数互联网用户,这并不是固定的.
Useragent String - 几乎所有浏览器都会在每次请求时发送它们所使用的浏览器类型.但是,这可以由用户在今天的许多浏览器中设置.
请求字段的集合 - 每个请求都会发送其他字段,例如支持的编码等.如果在聚合中使用这些字段可以帮助识别用户的计算机,但同样取决于浏览器并且可以更改.
Cookies - 设置cookie是识别机器的另一种方式,或者更具体地说是机器上的浏览器,但正如其他人所说,这些可以被用户删除或关闭,并且只适用于浏览器,而不是机.
因此,正确的回答是,您无法单独通过HTTP over IP协议实现您的生活.但是,使用cookie,IP以及HTTP请求中的字段的组合,您很有可能猜测,排序,它是什么机器.用户倾向于只使用一个浏览器,并且经常使用一台机器,因此这可能相当可靠,但这取决于受众......技术人员更容易弄乱这些东西,并使用更多的机器/浏览器.此外,这甚至可以与一些地理定位IP的尝试相结合,并使用该数据.但无论如何,没有任何解决方案始终是正确的.
cookie和非cookie方法都存在缺陷.但如果你能原谅cookie方法的缺点,这就是一个想法.
如果您已在自己的网站上使用Google Analytics,那么您无需编写代码来自行跟踪唯一身份用户.Google Analytics(分析)会通过__utma
Cookie值为您执行此操作,如Google文档中所述.通过重用此值,您不会创建额外的cookie有效负载,这可以提高页面请求的效率.
您可以轻松编写一些代码来访问该值,或使用此脚本的 getUniqueId()
函数.
与以前的解决方案一样,cookie是一种很好的方法,请注意它们识别浏览器.如果我访问了Firefox中的某个网站,然后在Internet Explorer中,将单独存储两个尝试的cookie.一些用户还禁用cookie(但更多人禁用JavaScript).
另一种需要考虑的方法是IP和主机名识别(请注意,拨号/非静态IP用户可能会有所不同,AOL也使用一揽子IP).但是,由于这只能识别网络,因此这可能不如cookie.
关于使用cookie的建议,可用于询问的唯一全面的标识属性包含在HTTP请求标头中.因此,可以使用这些的一些子集来为用户代理(即,浏览器)创建伪唯一标识符.此外,大多数此类信息可能已默认记录在Web服务器软件的所谓"访问日志"中,如果没有,则可以轻松配置为这样做.然后,可以开发一个只扫描此日志内容,创建指纹的功能每个请求包括,例如,IP地址和用户代理字符串等.可用的数据越多,甚至包括特定cookie的内容,就增加了该指纹唯一性的质量.虽然,正如许多其他人已经说过的那样,HTTP协议并没有使这100%万无一失 - 充其量它只能是一个相当好的指标.
当我使用从未访问过我的网上银行网站的机器时,我会被要求进行额外的身份验证.然后,如果我第二次回到网上银行网站,我不会被问到额外的身份验证...我删除了IE中的所有cookie并重新登录到我的网上银行网站,完全期望再次被问到身份验证问题.令我惊讶的是我没有被问到.这不会让人相信银行正在做某种不涉及cookie的电脑标签吗?
这是银行使用的一种非常常见的身份验证类型.
假设您通过example-isp.com访问您的银行网站.您第一次来到那里时,系统会要求您输入密码以及其他身份验证.一旦您通过,银行就会知道用户"thatisvaliant"经过身份验证,可通过example-isp.com访问该网站.
将来,当您通过example-isp.com访问该网站时,它不会要求额外的身份验证(超出您的密码).如果您尝试通过another-isp.com访问银行,银行将再次执行相同的例行程序.
总而言之,根据您的IP地址,银行识别您的ISP和/或网络块是什么.显然,并非ISP的每个用户都是您,这就是银行仍然要求您提供密码的原因.
当您在其他国家/地区使用信用卡时,您是否有过信用卡公司电话来验证一切正常?同样的概念.