JavaScript唯一浏览器标识符

50

有没有办法在JavaScript中为浏览器创建唯一的ID?

我不是说每次生成都是随机的ID,而是唯一于生成它的浏览器,并考虑到它所运行的计算机。

例如:

Windows 7 Chrome 可能会生成:asdh128hakj4gh

Windows 7 Opera 可能会生成:23hjad823hjakk

Windows 7 Chrome,在不同的硬件上,可能会生成:asd238881jaal

等等......

有没有办法实现这个功能?


2
Chrome在Windows 7上运行的所有计算机的ID应该是相同的,还是您想要类似于会话ID的ID? - Jan Aagaard
ID会因操作系统、硬件和浏览器的不同而不同,但如果在相同的操作系统、硬件和浏览器上生成两次,则ID将是相同的。 - Ozzy
6个回答

50

2
在当前的Django项目中使用fingerprintjs2 JavaScript库,它运行得非常好... - dave4jr
最新版本的Firefox似乎无法正常工作。出现了Fingerprin2未定义的错误。请查看http://valve.github.io/fingerprintjs2/。 - Adnan
同一浏览器即使在不同的机器上,使用相同版本也会有相同的指纹。 - Neeraj Singh Chouhan

12

使用cookies和一些独特的哈希值。即使在一台计算机上有多个浏览器,每个浏览器都有自己的cookie存储器。


也许不是真的。我打开了一个 FireFox,给它一个随机的 cookie ID,然后打开第二个 FireFox,它读取了相同的 cookie。 - Doug Null
21
是的,每个浏览器安装都有它们自己的cookie存储空间,而不是每个浏览器实例都有。 - IProblemFactory
我喜欢这个概念,但是一些示例代码会更有帮助。我应该如何使用随机哈希?作为 cookie body 还是作为 cookie name?如果是 name,则应该如何取回它? - Wojciech Jakubas
尝试使用例如uuid生成一些id - 这里是流行的npm包:https://www.npmjs.com/package/uuid,并将其保存为cookie。您也可以使用Js进行此操作。 - IProblemFactory

6
您可以使用biri库。该ID是每台计算机生成的,除非计算机的MAC地址发生更改,否则不会更改。

2
好的解决方案。但是这是在GPL许可证下。 - Roy
当我们从一个网络切换到另一个网络时,ID也会发生变化。因此,并不总是相同的。 - Subramanian
如果它是在GPL许可下,会有什么问题呢,@Roy? - Karma Blackshaw
1
@KarmaBlackshaw 我不使用GPL许可证,因为我的律师建议我不要使用。你可以和你的律师讨论这个问题。你可能会发现这篇文章有帮助:https://blog.jamesbayley.com/2014/01/17/gpl-living-with-cancer/ - Roy
1
@Roy 这个实现非常简单,你甚至可以凭记忆重新创建它。 - Finesse

3

     var Sys = {};
        var ua = navigator.userAgent.toLowerCase();
        var s;
        (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
        (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
        (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
        (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
        (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;

   
        if (Sys.ie) document.write('IE: ' + Sys.ie);
        if (Sys.firefox) document.write('Firefox: ' + Sys.firefox);
        if (Sys.chrome) document.write('Chrome: ' + Sys.chrome);
        if (Sys.opera) document.write('Opera: ' + Sys.opera);
        if (Sys.safari) document.write('Safari: ' + Sys.safari);

使用以下代码可以获取浏览器的类型和版本,根据不同浏览器,该值应该是唯一的。如果您想基于此生成其他唯一ID,则可以使用它。


1
如何使用用户代理 + 客户端IP + 'extrasalt' 的MD5呢? 这会让你接近完美,但并不是完美的,因为有可能2个客户端具有相同的IP(使用NAT)和完全相同的用户代理(严格控制的IT部门=相同的部署,或只是运气)。

10
大多数客户端使用动态IP地址,如果一个客户端能够保持相同的IP地址几天,那就很幸运了。所以当IP地址发生变化时,您会错误地将新的哈希值视为新的浏览器实例。 - reallynice

0

看起来你想做的是某种许可证?这样只有一些浏览器可以被注册使用你的应用程序吗?

不幸的是,没有办法读取用户计算机硬件设置。正如一个答案所说,你可以在该机器上存储cookie,但它很容易丢失。

如果你只使用旧版IE浏览器,那么可以使用ActiveX来读取计算机硬件:http://www.devarticles.com/c/a/JavaScript/How-to-Use-JavaScript-for-Hardware-Knowledge/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接