我需要找出一种唯一标识访问我正在创建的网站的每台计算机的方式。有人对如何实现这一目标有任何建议吗?
因为我希望该解决方案能在所有机器和所有浏览器上正常运行,所以我试图使用javascript创建一个解决方案。
感谢您的帮助。谢谢。
编辑:
Cookies不会。
假设计算机没有发生硬件更改,我需要有能力创建一个计算机唯一且可重复的GUID。我正在考虑的方向是获取网卡的MAC和其他具有这种性质的信息,这些信息将使机器访问该网站。
我需要找出一种唯一标识访问我正在创建的网站的每台计算机的方式。有人对如何实现这一目标有任何建议吗?
因为我希望该解决方案能在所有机器和所有浏览器上正常运行,所以我试图使用javascript创建一个解决方案。
感谢您的帮助。谢谢。
编辑:
Cookies不会。
假设计算机没有发生硬件更改,我需要有能力创建一个计算机唯一且可重复的GUID。我正在考虑的方向是获取网卡的MAC和其他具有这种性质的信息,这些信息将使机器访问该网站。
Answers:
这些人已经开发出一种指纹识别方法,可以高度准确地识别用户:
https://panopticlick.eff.org/static/browser-uniqueness.pdf
我们通过根据请求将其传输到网站的版本和配置信息来调查现代Web浏览器受到“设备指纹识别”的程度。我们实施了一种可能的指纹识别算法,并从访问我们测试侧panopticlick.eff.org的大量浏览器样本中收集了这些指纹。 。我们观察到指纹的分布至少包含18.1位的熵,这意味着如果我们随机选择一个浏览器,充其量我们只能期望286,777个其他浏览器中的一个会共享其指纹。在支持Flash或Java的浏览器中,情况更糟,平均每个浏览器至少携带18.8位识别信息。在我们的示例中,使用Flash或Java的浏览器中94.2%是唯一的。
通过观察回头客,我们可以估算浏览器指纹随时间变化的速度。在我们的样本中,指纹的变化非常快,但是即使是简单的启发式方法也通常能够猜测指纹何时是先前观察到的浏览器指纹的“升级”版本,正确的猜测率为99.1%,假阳性率仅为0.86%。 。
我们讨论了实践中隐私威胁浏览器指纹的构成,以及可能适合采取哪些对策。在保护可指纹性和某些类型的可调试性之间需要权衡取舍,在当前的浏览器中,可调试性在保护隐私方面具有很高的权重。矛盾的是,如果没有足够多的人使用防指纹隐私技术,它们可能会失败。我们表明,某些隐私措施目前已成为这一悖论的受害者,但其他措施却没有……
我不知道是否存在或将永远只有一种方法可以单独使用浏览器来唯一标识计算机。主要原因是:
即使有一些方法可以在不使用Cookie的情况下跟踪计算机,总会有一种绕过计算机的方法,而软件会自动执行此操作。如果您确实需要基于计算机来跟踪某些内容,则必须编写本机应用程序(Apple Store / Android Store / Windows程序/等)。
我可能无法回答您提出的问题,但可以向您展示如何实现会话跟踪。使用会话跟踪,您尝试跟踪浏览会话,而不是计算机访问您的站点。通过跟踪会话,您的数据库架构将如下所示:
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
。基于会话的跟踪的缺点:
有很多实现方法。我想我无法涵盖所有内容,我只会列出我最喜欢的内容,这样可以得出结论。记住这一点。
我将使用称为永远的cookie来跟踪会话。即使用户删除其cookie或更新其浏览器,这些数据也将自动重新创建自己。但是,它无法在用户删除其cookie和浏览缓存的同时幸免。
为了实现这一点,我将使用浏览器缓存机制(RFC),WebStorage API(MDN)和浏览器cookie(RFC和Google Analytics(分析))。
为了利用跟踪ID,您需要将其添加到您的隐私权政策和使用条款中,最好在“ 跟踪 ”小标题下。我们将在document.cookie
和 上使用以下键window.localStorage
:
确保在所有使用跟踪的页面上都包含指向您的隐私政策和使用条款的链接。
您可以将会话数据存储在网站数据库中或用户计算机上。由于我通常在使用第三方应用程序(例如Google Analytics(分析)/ Clicky等)的较小站点(少于1万个连续连接)上工作,因此最好将数据存储在客户端计算机上。这具有以下优点:
缺点:
Browser|BrowserVersion|OS|OSVersion|Processor|MozzilaMajorVersion|GeckoMajorVersion
getISP(requestIP)|getHTTPSClientKey()
FingerPrint.get()
BrowserID|ComputerID|randombytes(256)
__utma
cookie 生成。getCookie(__utma).uniqueid
前几天,我和女友一起看温蒂·威廉姆斯的节目,当主持人建议观众至少每月删除一次浏览器历史记录时,我感到非常震惊。删除浏览器历史记录通常具有以下效果:
window.localStorage
(aww人)。大多数现代浏览器都使此选项易于使用,但不要害怕朋友。因为有一个解决方案。浏览器具有缓存机制来存储脚本/图像和其他内容。通常,即使我们删除了历史记录,该浏览器缓存仍然保留。我们需要的只是一种在此处存储数据的方法。有两种方法可以做到这一点。更好的方法是使用SVG图片并将我们的数据存储在其标签中。即使使用Flash禁用了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-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
标头告诉浏览器该文件基本上从不修改。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
。这意味着他们必须与受害者(Tricky)拥有相同的ISP提供者。这将使我们的受害者有机会在自己的国家采取法律行动。Haxor还必须从受害者(Hard)获取HTTPS会话密钥。BrowserID
。任何人都可以欺骗User-Agent字符串(讨厌)。SessionID
(非常困难)。批量攻击不会起作用,因为我们使用时间戳来生成加密/签名密钥,因此基本上就像为每个会话生成新密钥一样。最重要的是,我们对随机字节进行加密,因此也不可能进行简单的字典攻击。我们可以通过转发GoogleID
和FingerprintID
(通过ajax或隐藏字段)并与之匹配来改善验证。
if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;
storageFacade.setItem
and storageFacade.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 这样的方法,该方法会每隔一段时间自动创建一次。
没有所有者的合作,就不可能确定访问网站的计算机。但是,如果他们允许您,则可以存储cookie以在机器再次访问您的站点时标识该机器。关键是,访客在控制之中;他们可以随时删除Cookie并以新访客的身份出现。
一种可能是使用Flash Cookie:
您需要构建一个小的(隐藏的)Flash电影来读取和写入它们。
无论选择哪种方法,请确保您的用户选择加入以进行跟踪,否则,您将侵犯他们的隐私并成为坏人之一。
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.
您可能想尝试在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 现在看来还很成熟, 但可以扩展。
希望能帮助到你!
Click to rediscover cookies
并看到null或未定义。所以这对我不起作用
在此科学文章中介绍了一种称为“画布指纹”的流行方法:“ Web永不忘记:野外的持久跟踪机制”。一旦开始寻找它,您会惊讶于它的使用频率。该方法创建唯一的指纹,该指纹对于每个浏览器/硬件组合都是一致的。
本文还回顾了其他持久跟踪方法,例如evercookies,重新生成http和Flash cookie以及cookie同步。
有关画布指纹的更多信息,请参见:
您只能通过HTTP连接获得少量信息。
IP-但是,正如其他人所说,由于ISP的动态分配策略,对于许多(即使不是大多数)互联网用户来说,这也不是固定的。
Useragent字符串-几乎所有浏览器都会在每次请求时发送它们属于哪种浏览器。但是,今天用户可以在许多浏览器中进行设置。
请求字段的集合-每个请求都发送其他字段,例如受支持的编码等。这些字段(如果用于汇总中)可以帮助标识用户的计算机,但是同样取决于浏览器并且可以更改。
Cookies-设置cookie是识别机器(或更具体地说是机器上的浏览器)的另一种方法,但是正如其他人所说的那样,它们可以被用户删除或关闭,并且仅适用于浏览器,而不适用于机。
因此,正确的响应是您无法仅通过HTTP over IP协议就可以实现自己的生活。但是,结合使用cookie和IP以及HTTP请求中的字段,您很有可能猜测一下它是什么机器。用户倾向于只使用一个浏览器,并且通常使用一台机器,因此这可能很容易理解,但这取决于受众。...技术人员更可能会弄乱这些东西,并使用更多的机器/浏览器。另外,这甚至可以与对IP进行地理位置定位并同时使用该数据的尝试结合在一起。但是无论如何,没有任何解决方案会一直都是正确的。
cookie和非cookie方法都存在缺陷。但是,如果您可以原谅cookie方法的缺点,那么这里就有一个想法。
如果您已经在网站上使用Google Analytics(分析),则无需自己编写代码来跟踪唯一身份用户。__utma
如Google文档所述,Google Analytics(分析)通过cookie值为您完成此操作。通过重用此值,您不会创建其他cookie有效负载,这对于页面请求具有效率优势。
您可以轻松地编写一些代码来访问该值,或使用此脚本的 getUniqueId()
功能。
getUniqueId()
在同一台机器不同的浏览器?
与以前的解决方案一样,Cookie是一个好方法,但是请注意,它们可以识别浏览器。如果我在Firefox中访问过一个网站,然后在Internet Explorer中访问,则将分别存储两次cookie。一些用户还禁用cookie(但更多人禁用JavaScript)。
可以考虑的另一种方法是IP和主机名标识(请注意,这些可能会因拨号/非静态IP用户而异,AOL也使用覆盖IP)。但是,由于这只能标识网络,因此可能无法像cookie一样有效。
当我使用从未访问过我的网上银行网站的机器时,系统会要求我进行其他身份验证。然后,如果我第二次回到网上银行站点,我没有被询问其他身份验证...我删除了IE中的所有cookie,然后重新登录到我的网上银行站点,完全希望再次被询问身份验证问题。令我惊讶的是,我没有被问到。这难道不使人相信银行正在做某种不涉及cookie的pc标签吗?
这是银行使用的一种非常常见的身份验证类型。
假设您正在通过example-isp.com访问银行网站。第一次到那里时,系统会要求您输入密码以及其他身份验证。通过之后,银行便知道用户“ thatisvaliant”已通过身份验证,可以通过example-isp.com访问该网站。
将来,当您通过example-isp.com访问该网站时,它不会要求进行额外的身份验证(除了密码之外)。如果您尝试通过another-isp.com访问银行,则银行将再次执行相同的例程。
综上所述,根据您的IP地址,银行的标识是您的ISP和/或netblock。显然,并非您ISP的每个用户都是您,这就是银行仍然要求您输入密码的原因。
您曾经有信用卡公司打电话来验证在其他国家/地区使用信用卡可以正常进行吗?相同的概念。
确实,您无法做的事情因为协议不允许这样做。如果普遍使用静态IP,那么您也许可以做到这一点。它们不是,所以您不能。
如果您真的想识别人,请让他们登录。
由于它们可能会移动到您网站上的不同页面,因此您需要一种跟踪它们移动的方法。
只要它们已登录,并且您通过cookie / link-parameters / beacons /无论如何跟踪它们在站点内的会话,就可以确定他们在这段时间内使用的是同一台计算机。
最终,如果您的用户没有使用自己的本地网络并且没有静态IP地址,那么这告诉您他们正在使用哪台计算机是不正确的。
如果您要与用户合作完成某项工作,并且每个cookie只有一个用户并且他们使用单个Web浏览器,则只需使用cookie。
Cookies对确定唯一身份访问者不会有用。用户可以清除cookie并刷新站点-然后他又被归类为新用户。
我认为执行此操作的最佳方法是实施服务器端解决方案(因为您将需要在某个地方存储数据)。根据您对此类数据的需求的复杂性,您将需要确定什么是唯一访问。明智的方法是允许IP地址在第二天返回,并进行唯一访问。一天中来自一个IP地址的多次访问不应视为唯一身份。
例如,使用PHP,获取访问者的IP地址并将其存储在文本文件(或sql数据库)中很简单。
服务器端解决方案将在所有计算机上运行,因为您将在用户首次加载您的站点时对其进行跟踪。不要使用javascript,因为这是用于客户端脚本编写的,而且用户可能在任何情况下都已将其禁用。
希望有帮助。
我猜这是我无法以编程方式唯一地标识正在访问我的网站的计算机。
我有以下问题。当我使用从未访问过我的网上银行网站的机器时,系统会要求我进行其他身份验证。然后,如果我第二次回到在线银行网站,则不会再询问其他身份验证。阅读我的问题的答案,我认为它一定是一个cookie。因此,我删除了IE中的所有cookie,然后重新登录到我的网上银行站点,完全希望再次被询问身份验证问题。令我惊讶的是,我没有被问到。这难道不使人相信银行正在做某种不涉及cookie的pc标签吗?
此外,经过大量的搜索,我发现以下一家公司声称出售一种解决方案,该解决方案可以唯一标识访问网站的机器。http://www.the41.com/products.asp。
如果您能进一步澄清这些矛盾的信息,我将不胜感激,我发现我将不胜感激。
我会结合使用cookie和flash cookie。创建一个GUID并将其存储在cookie中。如果该cookie不存在,请尝试从Flash cookie中读取它。如果仍然找不到,请创建它并将其写入Flash Cookie。这样,您可以在浏览器之间共享相同的GUID。
一个恶作剧:
创建2个注册页面:
首次注册页面:无需任何电子邮件或安全检查(只需输入用户名和密码即可)
第二注册页面:具有较高的安全级别(电子邮件验证请求和安全映像等)
为了使客户满意并易于注册,默认注册页面应为(第一注册页面),但在 (第一注册页面)中存在隐藏的限制。这是IP限制。如果IP试图第二次注册(例如,少于1小时),而不是显示阻止页面。您可以显示(第二注册页面) 。
请注意:(第一注册页面)和(第二注册页面)不应放在分开的页面中。您只制作一页。(例如:register.php),并使其在第一PHP样式和第二PHP样式之间进行切换变得非常聪明。