zoukankan      html  css  js  c++  java
  • 网站追踪技术:前端持久化evercookie

      前端持久化就是要将数据永久的保存在前端,让数据难以删除或者删除后能够重新恢复。存储的数据可以理解为是一种 “僵尸数据”,下面介绍一种前端持久化方法 -- evercookie。

    一、简介

      evercookie是由Samy Kamkar(美国白帽黑客、安全研究员)开发的一组jsApi,它的目的在于持久化cookie,即使用户清除标准cookie、Flash cookie等之后依然能够获取设置过的数据,并且重新恢复清除掉的cookie(比较狭隘,本质上是恢复所有维度,一个重新写的动作)。

    二、原理

      就是将数据写入浏览器各个维度,获取的时候再从各个维度中读出来,只要其中一个有数据就可以将数据取出。

      比较强大的地方在于:1、存储的维度非常多,寻常用户难以清理;2、取数据的时候会将清除的数据重新恢复,名副其实的僵尸cookie;

      下面介绍下存储的维度以及读取数据的方式和思路。

    三、evercookie存储数据的维度

    1、标准HTTP Cookie

      evercookie会将数据存在 document.cookie 中,获取的时候直接获取就可以了,没什么可说的,这部分数据是比较容易被清除的,比如浏览器清除cookie、js脚本设置等,分享关于cookie的两个点:

    • http请求自带本域以及根域下所有cookie,CSRF的根源就在这里;

    • js设置cookie默认在当前域以及当前路径下, cookie一般都会跨路径使用,一定注意设置path字段;

    2、flash cookie

      evercookie提供了一个flash文件,使用的时候会将数据存储在flash的本地对象中,只有删除对应的flash存储文件才可以清除

    3、localStorage、sessionStorage、globalStorage

    4、openDatabase

      HTML5的WebSQL数据库,可以理解为本地存储 Local Storage 和 Session Storage 的一个加强,用来操纵大量结构化数据,由于各个浏览器实现原因,WebSQL规范已经被废弃掉了;

    5、IndexedDB

      浏览器内置的一种数据库,永久保存数据,IndexDB与WebSQL比较,IndexedDB更像是一个NoSQL数据库,而WebSQL更像是关系型数据库,使用SQL查询数据;

    6、ETag存储

      ETag存储也要依靠后台,利用的原理主要是当浏览器第一次访问一个请求的时候如果服务器响应设置ETag标签,浏览器第二次访问会自动带上一个IF-NONE-MATCH上来(跟ETag设置的值相同),所以只要把数据值存在ETag上,取数据的时候直接去后台查链接上的 IF-NONE-MATCH 字段就可以了

    7、 web Cache

      看evercookie的思路是对 http cookie 的一种加强,相当于通过后台对cookie设置个过期时间

    8、silvelright客户端存储

      silvelright也是一种本地存储方式,可以将数据直接存在本地,类似于flash可以跨浏览器获取,需要安装silverlight插件、下载 .xap 的编译文件,对sliverlight不了解,有兴趣的同学可以自行研究一下。

    9、java应用程序本地存储

    10、IE的userData存储

    11、window.name

      window.name是window的一个很特殊的属性,可以设置,有两个特点:

    • window.name设置后刷新页面不会消失;

    • iframe从一个src跳转到另一个src 获取contentWindow.name 不会发生变化;

      evercookie主要是利用了上面的一点,只要页面不刷新,页面随便清理都不会发生变化

    12、<a>标签历史访问状态存储

      浏览器中的 <a> 标签有个特性, 同一个浏览器被访问过后状态会变成 "visited" 状态,一般只有清理浏览器浏览记录才会消失,evercookie利用了这点进行存储。

      简单说下思路:

    1. 构造<a>标签并预设visited样式(a:visited)作为访问校验值;

    2. 构造http请求,请求的地址为设置的键以及值的各个字符(多个http,个数是值的长度);

    3. 写数据通过构造iframe对上面的http请求进行一次访问;

    4. 读数据用键和一个字符构造一个链接赋予<a>标签的href,获取<a>标签的样式与预设visited样式进行

    5. 直接将http请求赋给<a>标签的href,获取如果样式为预设visited的样式说明这个http请求访问过,解出字符;

      说明:2中设置的值是个encode后的值,最后一步解出的字符拼装后需要decode后才能获取到原来的值,evercookie里面的实现很有意思,有兴趣的可以看下。

    四、读数据

      evercookie读数据只说一点就可以了,它的思想并不是从任意维度获取到数据就直接返回结果,而是要将所有设置的维度全部取出进行最优解查找,可以防止部分数据被篡改导致的数据异常;也带来一个问题,因为很多都是异步获取,比如数据库、e-tag等,那么获取数据就不是立即获取,会有一部分等待时长。

    五、缺点和注意事项:

      Evercookie可能会给您或您的用户带来问题。

      某些存储机制涉及在客户端浏览器中加载Silverlight或Flash。在某些机器上,这可能是一个非常缓慢的过程,有很多磁盘抖动。在较旧的移动设备上,这可能会使您的网站无法使用。

      CSS历史记录首次设置cookie时,敲门可能会导致大量HTTP请求。

      在某些圈子里,使用Evercookie被认为是粗鲁的。在生产中使用Evercookie时,请考虑您的声誉和受众。

      浏览器供应商正在尽最大努力填补Evercookie利用的许多漏洞。这对互联网来说是一件好事,但它意味着今天有效的东西明天可能效果不好。

      您自己决定使用Evercookie。做出明智的选择。

  • 相关阅读:
    盛最多水的容器
    寻找2个有序数组的中位数
    从链表中删除总和值为0的连续节点
    链表中的下一个更大节点
    链表的中间节点
    循环有序链表的插入
    设计链表
    链表组件
    扁平化多级双向链表
    将二叉搜索数转化为排序的双向链表
  • 原文地址:https://www.cnblogs.com/goloving/p/12108278.html
Copyright © 2011-2022 走看看