如何识别来自不同浏览器的用户

时间:2017-11-28 16:10:42

标签: javascript php symfony cookies

我有创建民意调查的任务。此调查背后的想法是在网站上可见,但没有用户。您无需登录用户即可回答民意调查。但是我需要做的是这样投票后一旦你不能投票两次。这不是一件非常难的事情,而且我经常在新闻网站上看到过。

这方面的一般解决方案是cookie。您将信息存储在cookie中,如果他们提交了答案,您可以将该信息存储在cookie中,这样您就可以了。

但是我想做更好的事情 - 我想这样做,如果你打开Chrome并投票然后打开Mozilla就不能再投票了。

首先想到的是使用IP,但是如果你在一个连接上有多台计算机怎么办?就像在一座大办公楼里一样?

这意味着无论他的互联网连接如何,我都需要一台特定计算机独有的东西。

我们想到的是使用特定且唯一的东西来为cookie生成ID。这意味着通过使用独特的东西,我将生成一个ID,对于特定的计算机,无论浏览器是什么,无论连接如何,ID都是相同的。您可以删除cookie,然后当我创建新的时,它将使用相同的ID创建,我将能够识别出拥有该计算机的人已经投票支持该投票。

我的问题是 - 我可以通过浏览器访问的计算机有什么独特之处?我正在使用PHP与Symfony和javascript for Front-end。

我将再次概述我想要实现的目标 - 即使该用户删除了所有cookie并切换浏览器或处于不同的连接上,也允许我识别没有登录的用户(计算机)。他可以使用VPN或从一个国家转移到另一个国家并切换互联网提供商或任何类似的东西......只要他在同一台计算机上并且该计算机没有接收到制动更改(修复,升级等)我需要认识到它。

2 个答案:

答案 0 :(得分:3)

这称为浏览器指纹识别。

检查https://browserleaks.com/以获取有关用户的数据列表。该网站使用客户端代码,您也可以使用它来获取您在那里看到的所有数据,包括:

- 他们安装了哪些字体

- 他们正在使用什么操作系统

- 他们的ISP

- 他们安装了哪些插件

- 使用<canvas>,一个非常独特的指纹本身

- 他们的屏幕分辨率

以及更多,特别是如果用户启用了Flash,WebGL或WebRTC。使用此数据,您可以在数据库中创建用户的“指纹”。例如,假设我访问了您的网站;你记录了我安装的所有322种字体,我有什么操作系统,我的ISP是谁,我安装了什么插件,我的屏幕分辨率等等。当我尝试从不同的浏览器甚至不同的IP进入你的网站时,你仍然可以从你收集的所有其他数据中确切地知道我是谁。

编辑:鉴于duskwuff的评论和downvote,我想我觉得有必要提供一些研究和结果的链接。请注意,浏览器指纹识别不是100%有效,因此不应像在数据库中那样使用唯一ID来绝对识别用户,但使用最新技术可以获得非常高的成功率。大多数网站都将其用于广告营销,或者如您所愿,使用反垃圾邮件技术:

https://panopticlick.eff.org/static/browser-uniqueness.pdf(效率99.1%) http://yinzhicao.org/TrackingFree/crossbrowsertracking_NDSS17.pdf(99.24%的有效性) http://mickvaites.com/wp-content/uploads/2013/09/T802_Michael_Vaites_2013-BrowserFingerprinting.pdf(效率为95%)

编辑2: 要实际实现这种高价的企业SaaS产品:https://www.npmjs.com/package/fingerprintjs2在“指纹识别源列表”下,您将看到用户访问您网站时将获得的不同数据列表。只要有人提交投票,您就应该在数据库中记录这些数据。在允许轮询提交之前,查询您的数据库,例如“有过这个用户代理,语言,颜色深度等的人在过去提交了民意调查吗?如果是,这可能是有人试图提交两次民意调查,所以不要允许提交。“这是非常简化的方法,并且不会很好地工作;在理想的世界中,您需要一种复杂的算法来检查所有数据点并确定用户与以前相同的概率。例如。也许他们改变了他们的时区来甩掉你的垃圾邮件检测;如果除时区之外的所有点都相同,那么您很容易检测到。

以一种简单的方式将其实现到相当高的准确度:使用画布指纹+已安装的字体。画布指纹非常准确,并且难以欺骗。与安装的字体相同。仅这两项数据就可以为您提供相当不错的垃圾邮件检测系统。用户可以在浏览器中禁用html画布,因此如果画布指纹数据为空,则需要阻止它们提交轮询。用户可以非常轻松地删除和添加字体,因此单独的字体并不完美,但两者的结合将阻止任何基本的恶意尝试多次提交投票。

答案 1 :(得分:1)

我能想到的唯一方法是使用Flash应用程序并使用共享对象。但这很难看,可以轻松击败,就像饼干一样。简而言之,您无法在客户端操纵任何以一致,可靠的方式完成您的建议。