一种浏览器指纹探测行为监测方法与流程

文档序号:16815408发布日期:2019-02-10 14:23阅读:293来源:国知局
一种浏览器指纹探测行为监测方法与流程

本发明属于网络通信领域,涉及一种对web站点探测用户浏览器指纹行为的监测方法,尤其涉及一种基于chrome扩展的浏览器指纹探测行为监测方法。



背景技术:

随着互联网技术的发展,互联网应用种类越来越多,用户参与互联网活动的形式越来越丰富,如电子政务、社交网络、网上购物、网上理财、机票酒店预订、即时通信等。互联网应用的普及使得收集用户真实信息的途径大大增多。用户对于互联网应用的使用程度越深入,其真实身份信息被互联网企业收集的可能性就越高,甚至可能已被很多不同的互联网企业掌握。网络在给我们的工作、生活带来便利的同时,也使得个人的信息变得更为透明,导致越来越多针对个人隐私信息的窃取、滥用等行为不断出现。最新的研究表明,web服务器对用户浏览器指纹的探测可以对用户达到90%的识别率。目前,并没有统一的标准来规范web服务提供方对用户隐私收集的范围与保护能力。因此设计一个可以兼顾用户隐私、又可以探究web站点究竟获取了哪些用户的隐私信息的监控方法就显得非常必要。一方面可以让用户清晰的了解,究竟哪些站点收集了什么信息,也可以为监管部门提供一项有力的工具进行客观可量化的监测。

目前针对网站隐私安全测评的技术方法主要有以下几种:

静态分析法,javascript在第三方追踪中有十分重要的作用,可以实现几乎所有的指纹收集追踪技术。根据目的不同,有指纹收集行为的javascript代码和没有该行为的javascript代码通常会调用不同的api集合。有研究通过爬虫爬取热门网站的原始javascript代码,进行静态分析。即在代码不运行的情况下来提取javascript代码中的api,并进行统计分析。静态分析的方法易于实现,但是无法对加入代码混淆或加壳的javascript代码进行分析。

第三方追踪探测。第三方在线追踪就是当用户浏览第一方网站时,嵌入在第一方网站中的与第一方网站不属于同一域或同一公司的第三方网站也在收集用户的点击、浏览指纹等行为信息。第三方追踪方法一般是将追踪代码嵌入到第一方浏览页面的iframedom中,所以阻止脚本执行在一定情况下可以防御主动指纹追踪,当第三方应用通过执行脚本来获取httpcookies,flashcookies,htmllocalstorage信息时,阻止脚本执行可以阻止这些有状态的追踪,阻止httpcookies或flashcookies也可以防御有状态的追踪;过滤协议头部可以防御某些被动指纹信息被获取;黑名单防御对黑名单中的第三方应用防御有效。但是上述阻止脚本执行等方法一方面容易被信息收集者跨越或忽略,另一方面也将影响网站的正常功能。



技术实现要素:

针对上述隐私安全现状和现有方法的不足,本发明提出一种基于chrome扩展的浏览器指纹探测行为监测方法。该方法通过api的改写,并在页面加载前替换api,可以监测api的调用次数,对不影响页面功能的指纹探测api可以进行混淆,使得利用浏览器指纹信息识别用户的功能难以发挥作用。这样不影响脚本代码的执行,保障网站的正常运行,也可以达到隐私保护的目的。

本发明能够实现对web服务的跨域监测,定量分析出其究竟收集了哪些用户浏览器的指纹信息,明确服务方对隐私信息的收集内容。本发明还能够对探测浏览器指纹的api进行混淆,使得服务方难以通过浏览器指纹信息唯一确定用户。

为了达到上述目的,本发明采用了以下方案:

一种浏览器指纹探测行为监测方法,其步骤为:

1)对可用于指纹探测的api进行改写,加入计数功能;

2)浏览器向web服务器请求页面,将该web服务器返回给该浏览器页面脚本中的api替换为改写后的对应api;然后将修改后的页面脚本返回给该浏览器;

3)当改写后的api被该web服务器调用执行时,更新该api的执行次数;然后将计数结果以cookie方式注入页面;

4)当该浏览器向web服务器再次向该web服务器请求页面时,从页面请求的http报头中获得计数用的cookie值并将其传递至目标域;

5)通过对该目标域中的cookie值确定该web服务器的浏览器指纹探测行为。

进一步的,对api进行改写还包括加入混淆内容;步骤3)中,当改写后的api被web服务器调用执行时,更新该api的执行次数并将该api改写时加入的混淆内容返回给该web服务器。

本发明首先对可用于指纹探测的api进行改写,可以加入计数功能(为api设置全局变量,每执行一次该api,相应api的计数变量增1,对执行该api的次数进行计数),或进行内容混淆。将改写后的api提前加载至页面脚本中,替换原api从而达到监控的目的。在原页面加载完成后把每个改写后的api计数结果以cookie方式注入页面(即将计数结果存入浏览器的cookie中)。浏览器下一次向web请求页面的时候通过截获http报头获得计数用的cookie值,并在chrome扩展中显示给用户。当web服务器调用这些改写的api之后,将返回给web服务器部分更改过的参数,使得web服务器无法通过原有参数的组合唯一的标识用户;同时具备计数功能,可以展示给用户每种api被调用过多少次。

本发明所述对用于浏览器指纹探测的api进行的改写,具体包括对属性api的改写,对对象api的改写和对方法api的改写。

进一步的,对属性api的改写,需要通过object.defineproperty()重新定义属性,若加入计数功能,则通过object.defineproperty()在属性api中增加一属性,该新增属性中设有一返回函数,该返回函数中设有计数器。若需要加入内容混淆功能,则提取属性api的原属性值转化为字符串,改写其中的内容,作为该属性api的返回属性值。注意避免改写影响页面功能的属性。

进一步的,对对象api的改写,需要通过newobject()重新定义新对象,在新对象中使用object.defineproperty()重新定义属性,若加入计数功能,则在新对象中属性定义的回调函数中增加计数器,并加1,同时返回原属性值。若加入内容混淆功能,则可以加入自定义内容至该对象中,避免改写其中的内容,以防正常调用该方法的功能无法实现。

进一步的,对方法api的改写,无需重新定义新方法、新属性,直接重写方法,若加入计数功能,则在新方法中增加计数器,并加1,同时直接“returnthis”返回原方法的结果。若加入混淆功能,则可以加入自定义内容至该方法中,将方法返回值转化为字符串,改写其中的内容,作为返回结果。比如更改获取timezone的方法,该方法本身是计算得到的返回值,若需要修改本地浏览器所在的时区,就需要对时区的计算方法进行改写。

本发明可以实时监听网页加载进程,将改写的api脚本代码在页面加载原javascript之前就提前注入待加载页面。

所述监听网页加载进程为使用监听chrome.tabs.onupdated事件,该事件表示chrome的标签进行了更新,有可能是刷新页面或者新建页面。当chrome的标签页进行了更新之后,则执行该事件中定义的内容。

进一步的,当页面正在加载时,即“changeinfo.status==='loading'”时,利用chrome.tabs.executescript方法在网站页面加载之前就把修改后的属性和方法提前注入到页面脚本中,从而使页面加载后查询修改的属性或调用修改的方法时,执行已修改过的api。

进一步的,所述executescript方法需要新建script元素标签,并挂在当前页面的html中。同时将上述改写api的代码以字符串的形式表示出,才能添加至新建脚本标签中,并作为脚本代码执行。

进一步的,该段新建script代码执行时机为“document_start”。即新建script元素标签,并挂在当前页面的html,从而在当前页面加载后执行该新建script元素标签(加载script元素标签,其中包含可执行的js代码,是否执行取决于html中是否调用该apii)。

本发明在原页面加载完成后把为每个计数器设置为cookie,并将该功能作为脚本注入当前页面运行。

所述计数器的值为运行页面后,调用了指纹api的次数。将该次数以“名称:值”的格式设置为cookie。并将实现该功能的代码以字符串形式写出。

进一步的,页面加载完成后执行设置cookie代码是由页面更新监听事件触发,当“changeinfo.status==='loading'”时,利用chrome.tabs.executescript方法在网站页面加载完成之后把设置cookie的代码注入到页面脚本中,从而在页面加载完成,并获得加载过程中的api调用次数后,将记录次数的变量值以cookie形式加载至当前页面中。

进一步的,该段新建script代码执行时机为“document_end”。

本发明通过截获http报头中各个计数器cookie的数值就可以获知网页查询属性、对象或调用方法的列表和次数,同时进行隐私泄露程度的分析,并通过扩展展示给用户。

所述截获http请求报头中的cookie值,是在浏览器再次与web网站(可以其他web服务)的tcp连接建立之后和http数据发送之前调用的事件onbeforesendheaders.addlistener,该事件允许扩展添加、修改或删除http的请求报头。

进一步的,chrome.cookies.getall可以获得该页面所有请求报头的cookie键值对,其中可以根据cookie名称获得相应的指纹调用次数的记录值。

进一步的,按照chrome扩展的onmessage信息传递机制,在background.js页面进行onmessage的监控事件,当获得由popup.js发送的约定message值时,发送响应的信息。将获得的记录指纹api调用次数的结果作为sendresponse内容发送给popup.js。

进一步的,popup.js使用获得的数据,估算当前web服务获得的用户浏览器指纹是否可以唯一确定某一用户,和该用户唯一性的概率。并由popup.html显示给用户。

进一步的,用户可被唯一性标识的概率的计算方法为根据下述公式:

其中,m为属性个数,p(ai)为第i个属性可以唯一确定用户的概率,该概率的值来源于最新学术论文中给出的数据并结合广泛的可选参数的调研结果得出的。n为被测web服务网站的用户量,由alaxe.com提供的数据进行估算得到的。

与现有技术相比,本发明的积极效果为:

本方法能对包括方法、属性、对象三种类型的浏览器指纹api进行改写,实现计数功能,可以针对web服务端对用户浏览器指纹的调用情况进行定量分析;本方法可以选择不影响页面功能的api进行改写,混淆用户浏览器指纹,使web服务端难以唯一识别用户;同时本方法将计数和分析结果通过浏览器扩展的形式展示给用户,使用户直观的了解自身浏览器指纹的泄露程度,可以选择使用的web服务,有针对性的保护自身隐私。

附图说明

图1为指纹探测监测扩展总体设计图;

图2为指纹探测监测扩展数据流向图。

具体实施方式

为了使本发明的目的、方案及优点更加清楚明白,以下参照附图并举实施例,对本发明作进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

指纹信息可以通过2种途径获得。一是通过执行脚本或插件中的代码获得,叫做主动指纹(activefingerprinting)信息。如cpu型号、时区、安装的插件、cookies是否可用等信息;另一种是通过查询网络流获得,叫做被动指纹(passivefingerprinting)信息。如ip地址、语言、http报头等。一些信息既可以通过代码执行获得,也可以通过网络流获得,比如操作系统类型、用户代理等。

下面以分析浏览器基本信息指纹、存储信息指纹、系统时间指纹为例,描述基于chrome扩展的浏览器指纹探测监测方法的具体实施。本发明不限于上述指纹探测的检测。任何可以通过执行脚本或插件中的代码获得的浏览器指纹信息(如屏幕指纹、canvas指纹等)均可使用本方法实现监测。浏览器指纹技术是指仅通过浏览器的各种信息,如系统字体、屏幕分辨率、浏览器插件,无需cookie等技术,就能近乎绝对定位一个用户。

如附图1,图2所示,本发明作为一个指纹探测的监测扩展,在web页面与web服务器通讯过程中,实时运行,对指纹探测关键api和数据流进行跨域监控。页面完成请求过程中,通过cookie或localstorage实现监控指标信息的跨域传递。

本发明的实施例中基本文件包括:manifest.json,background.js,popup.js,popup.html。

manifest.json文件是主要配置文件,包含资源定义及配置信息,里面包含了版本号,插件名称,默认页面,content_scripts,permissions等基本信息,这里只要配置即可进行功能实现。这个文件能将本发明中的css,javascript文件,接口权限等组织起来。

background.js页面是一个运行在扩展进程中的html页面,用来执行本发明的主要功能。它在扩展的整个生命周期都存在,同时,在同一时间只有一个实例处于活动状态。本发明的核心功能在该文件中实现。

popup.html,popup.js文件是点击扩展图标所展示出的页面,并运行这个html引入的js。这是一个普通的html页面,里面可以写css,也可以加载javascript文件,也可以给里面的节点添加事件。不过这个文件以及加载的js无法访问当前打开的标签页中的dom节点。该页面用来给用户展示分析结果。

本实施例中,监控扩展加载脚本代码的基本流程描述如下。以请求www.baidu.com为例,主要监控实施步骤为:

1、在background.js中,替换属性、对象和方法指纹的api,添加计数或内容混淆功能;

2、当监测到浏览器标签刷新或新建时,将更改后的api在页面加载之前替换原有api;

3、在页面加载完成后将计数结果以cookie形式传递至popup.js;

4、在popup.js中进行分析,并在popup.html中展示给用户分析结果。

首先,本发明可以修改属性、对象、方法等指纹api。

本实施例以浏览器平台信息指纹为例,说明如何修改属性指纹api。定义platform_count和platform变量分别记录调用“navigator.platform”这一查询系统平台的api的次数和本身的属性值。然后利用object.defineproperty函数重新定义目标对象navigator的platform属性。给platform属性添加特性的函数中,在只改写加入计数功能时,将计数用的变量+1,并返回platform即原属性值。若要改写加入混淆功能时,则将platform变量进行调整,如变为字符串并随机调整个别位的字符或加随机尾缀,再进行返回。

本实施例以浏览器存储信息指纹为例,说明如何修改对象指纹api。对于localstorage和sessionstorageapi来说,不是属性,而是个对象,所以新建记录原值的变量时要使用newobject()定义。然后利用object.defineproperty函数重新定义目标对象window的localstorage属性。给localstorage属性添加特性的函数中,在只改写加入计数功能时,将计数用的变量+1,并返回新建的_localstorage,即原对象值。若要改写加入混淆功能时,则可以为localstorage增加(setitem)一个存储键值对,或者更改localstorage.length的值,再进行返回。

本实施例以系统时间指纹为例,说明如何修改方法指纹api。对于调用对象date()的方式,可以利用上述改写对象类指纹api的方法进行改写。对于采用直接调用gettimezoneoffset方法来获得用户操作系统时区的方式,定义计数变量后,则可以直接改写函数:date.prototype.gettimezoneoffset=function(){}。在函数中将计数变量加1,并直接returnthis。因为该返回值与60的比值为该系统的时区信息,若要改写加入混淆功能时,则可以直接返回一个合适的固定值,该值为60的倍数,如,60或120等均可。

其次,本实施例在实时运行的background.js脚本程序中,建立tabs.onupdated监听事件,实时监听浏览器标签的变化。当浏览器新建标签页或刷新已有标签后,触发该事件执行。当标签变化时会有两次状态变化,onupdated事件就会被执行两次。所以要选择代码执行时的页面状态。加入判断,在tab.status的状态为loading的时候,即准备加载页面的时候,加入改写的代码,在tab.status的状态为complete的时候,改写api中的计数参数已记录好监控的api执行次数,实现混淆功能的改写api也已将混淆后的信息发送给服务器。这时再加入cookie记录的代码。

加入改写api代码的过程是,使用tabs.executescript函数,在“code”参数中编写要执行的代码,即可以在当前标签页面运行自定义的代码。创建“script”htmldom元素将改写的代码以字符串的形式innerhtml至“script”标签下,该代码执行时间选为"document_start",页面开始加载时就执行。

加入cookie记录次数的代码过程是,使用tabs.executescript函数,在“code”参数中编写要执行的代码。创建“script”htmldom元素将cookie设置的代码以字符串的形式innerhtml至“script”标签下,该代码执行时间选为"document_end",页面加载结束后执行该代码。

再次,本实施例将cookie形式存储的监控结果传递至popup.js。在background.js的脚本中将记录监控api执行次数的数据作为cookie存储,按照chrome扩展的onmessage信息传递机制,当用户点击popup.html气泡页面时,popup.js发送约定的信息,如“hello”。background.js页面中进行onmessage的监控事件,当约定的message值,即“hello”时,将获得的记录指纹api调用次数的结果作为响应信息sendresponse内容发送给popup.js;发送响应信息的形式可以是以字符串编写的包含cookie值的html数据。

最后,监控api执行次数的数据发送给popup.js后,可以对该数据进行分析。本实施例分析当前web服务获得的用户浏览器指纹确定用户唯一性的概率。并由popup.html显示给用户。即告诉用户web服务提供方以多大的概率已唯一标识了您。

以上所述仅为本发明的一个实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1