网站追踪技术将用”帆布指纹识别”取代cookie

 更新时间:2016年11月25日 17:05  点击:2201
网站或者广告联盟为了追踪用户访问记录,利用cookie是一个比较方便的技术实现,但是现在网民越来越关心cookie带来的隐私问题,那么现在一种新的技术“帆布指纹识别”或许可能替代。

【前言】

一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动。Cookie技术是非常受欢迎的一种。当用户访问一个网站时,网站可以在用户当前的浏览器 Cookie中永久植入一个含有唯一标示符(UUID)的信息,并通过这个信息将用户所有行为(浏览了哪些页面?搜索了哪些关键字?对什么感兴趣?点了哪些按钮?用了哪些功能?看了哪些商品?把哪些放入了购物车等等)关联起来。

而随着网民对个人隐私的重视,Cookie越来越不受待见。不少安全工具甚至是浏览器都开始允许或引导用户关闭Cookie功能,比如很多主流浏览器都有一个“隐私模式浏览”功能。这样以来,网站就很难追踪用户行为了。但仍然有一些方法可以让网站去追踪每一个访问者的行为,比如通过flash cookie的方式也可以达到唯一标识和追踪的目的。

笔者近期注意到,国外媒体报道了一种非常难以摆脱的新型在线追踪工具被用来尾随从白宫官网到色情网站YouPorn.com的热门网站的访问者。经过分析,这个就是另一种比较新的访客追踪技术:“帆布指纹识别”技术,具体代码见附录6。这个技术的独特之处是:它不像通过Cookie或者Flash Cookie等之类的方式,你基本是无法屏蔽它的。

【原理分析】

笔者收集整理了很多知名站点上的类似代码,详见附录4,从这些“帆布指纹识别”代码可以看出,均使用到了HTML5专属标签的一个现状:在绘制canvas图片时,同样的canvas绘制代码,不同机器和浏览器绘制的图片特征是相同并且独一无二的,这样以来,提取最简单的md5值便可以唯一标识和跟踪这个用户。

产生canvas元素,获取绘画的内容,需要使用到canvas.toDataURL()方法,该方法返回的是图片内容的base64编码字符串。对于PNG文件格式,以块(chunk)划分,最后一块是一段32位的CRC校验,提取这段CRC校验码便可以用于用户的唯一标识:

function bin2hex(s) {
    var i, l, o = '', n;
    s += '';

    for (i = 0, l = s.length; i < l; i++) {
            n = s.charCodeAt(i) .toString(16);
            o += n.length < 2 ? '0' + n : n;
    }

    return o;
}

 

var canvas = document.createElement(‘canvas’);
var ctx = canvas.getContext(’2d’);
var txt = ‘http://chenpeng.info/’;
ctx.textBaseline = “top”;
ctx.font = “14px ‘Arial’”;
ctx.textBaseline = “chenpeng.info”;
ctx.fillStyle = “#f60″;
ctx.fillRect(125,1,62,20);
ctx.fillStyle = “#069″;
ctx.fillText(txt, 2, 15);
ctx.fillStyle = “rgba(102, 204, 0, 0.7)”;
ctx.fillText(txt, 4, 17);
var b64 = canvas.toDataURL().replace(“data:image/png;base64,”,”");
var bin = atob(b64);
var crc = bin2hex(bin.slice(-16,-12));
console.log(crc);

ab99cca6

chrome隐身模式测试:

 

image

 

同一机器的chrome浏览器,无论正常模式还是隐身模式,得到的crc值始终一致。而对于不同机器得到的值是不同的,追踪效果显而易见。

看到这里,相信很多人想问,Why?为什么会出现这样的情况?同样的js代码,在不同设备的浏览器上,结果是唯一并且各不相同的。这到底是为什么?其实原因很简单,同样的HTML5 Canvas元素绘制操作,在不同的操作系统不同的浏览器上,产生的图片内容其实是不完全相同的。出现这种情况可能是有几个原因:

1、在图片格式上,不同web浏览器使用了不同的图形处理引擎、不同的图片导出选项、不同的默认压缩级别等。

2、在像素级别来看,操作系统各自使用了不同的设置和算法来进行抗锯齿和子像素渲染操作。

因此,即使是相同的绘图操作,最终产生的图片数据在hash层面上依然是不同的。这个具体代码层面,恐怕要去搞懂各个主流浏览器的实现和以及操作系统的渲染。笔者精力所限,短期很难给出。大家可以自行摸索下,欢迎交流J

【后话】

HTML5千变万化,利用canvas 这一特性来实现用户追踪,目前并没有好的对抗方案,未来也只能依靠广大浏览器厂商自行了断,实现canvas绘图机制的随机化或许可以很好的保护用户隐私,防止被追踪。

文中涉及到的代码和技术细节,只限用于技术交流,切勿用于非法用途。另外,如果想要研究更多的用户追踪技术,推荐去研究下大名鼎鼎的专注于访客追踪的开源项目:evercookie【附录5】,这个猥琐的小工具,通过几乎所有你想到和想不到的方式(Cookie、Flash、 Silverlight、Web History、HTTP ETags、Web cache、window.name caching、userData storage、HTML5、甚至是java的漏洞等)来跟踪访问网站的用户行为。

PHP in_array() 函数检查数组中是否存在某个值,如果存在则返回 TRUE ,否则返回 FALSE了,非常的好用了,下面我深入来为各位介绍in_array() 函数.

最近在用php写一段代码时,要用到判断某值是否在另外一组值中。而in_array 函数就是用来检查数组中是否存在某个值 。直接通过概念理解比较模糊,可以通过具体例子了解其作用。

语法:

bool in_array( mixed needle, array array [, bool strict] )

参数说明:
参数 说明
needle 需要在数组中搜索的值,如果是字符串,则区分大小写
array 需要检索的数组
strict 可选,如果设置为 TRUE ,则还会对 needle 与 array 中的值类型进行检查

例1:

<?php
$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
    echo "Got Irix";
}
if (in_array("mac", $os)) {
    echo "Got mac";
}
?>

以上代码的执行结果是:

Got Irix
第二个条件失败,因为 in_array() 是区分大小写的。

例2:

<?php
$europe = array("美国","英国","法国","德国","意大利","西班牙","丹麦");
if (in_array("美国",$europe)) {
echo "True";
}
?>

同上面一样,执行结果为True 。

例3:严格类型检查例子

<?php
$a = array('1.10', 12.4, 1.13);
if (in_array('12.4', $a, true)) {
    echo "'12.4' found with strict check ";
}
if (in_array(1.13, $a, true)) {
    echo "1.13 found with strict check ";
}
?>

其输出结果是:

1.13 found with strict check

例4:数组中套用数组

<?php
$a = array(array('p', 'h'), array('p', 'r'), 'o');
if (in_array(array('p', 'h'), $a)) {
    echo "'ph' was found ";
}
if (in_array(array('f', 'i'), $a)) {
    echo "'fi' was found ";
}
if (in_array('o', $a)) {
    echo "'o' was found ";
}
?>

其输出结果为:

  'ph' was found
  'o' was found
其具体用法如下:

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
在 haystack 中搜索 needle,如果没有设置 strict 则使用宽松的比较。

注:自php5.4以后。数组定义由array()换成了array[] 。

SQLite是一款小巧轻型的数据库,支持的SQL语句不会逊色于其他数据库,支持的程序语言有Tcl、C#、PHP、Java等。现在我们来学习在PHP中如何使用SQLite。

一、如何建立文件夹:

SQLite会自动判断,文件夹是否存在,如果不存在才会建立。

try{
$db_conn = new PDO('sqlite:mydb.sqlite');
}catch(PDOException $e){
echo 'Error';
}

$stmt = "CREATE TABLE mytable(id, user)";
$db_conn->exec($stmt);

二、如何写入文件:

使用方式和 MySQL 差不多。

$stmt = "INSERT INTO mytable(id, user) VALUES('1', 'AAA')";
$db_conn->exec($stmt);

三、如何使用资料:

使用方式和 MySQL 差不多。

$sth = $db_conn->prepare("SELECT id, user FROM mytable");
$sth->execute();
while($row = $sth->fetch(PDO::FETCH_ASSOC)){
echo $row['id'].':'.$row['user'].'';
}

字符串匹配在php中非常常见,本文通过实例来讲解一下php中最简单的字符串匹配算法,希望初学php的同学通过本实例,对字符串匹配有所了解。

本文实例讲述了php中最简单的字符串匹配算法,具体实现方法如下:

 代码如下 复制代码
<?php
/*
最简单字符串匹配算法php实现方式
 
T: ababcabc
P: abc
 
0.          1.          2.
ababcabc    ababcabc    ababcabc
|||          |||          |||
abc          abc          abc
(X)          (X)          (O)
 
3.          4.          5.
ababcabc    ababcabc    ababcabc
  
|||          |||          |||
  
abc          abc          abc
  
(X)          (X)          (O)
*/
 
$str="ababcabc";
$search="abc";
 
$strlen=strlen($str);
$searchlen=strlen($search);
 
//1.遍历$str字符串
for($i=0;$i<$strlen;$i++){
    if($i+$searchlen>$strlen){
        echo '超出长度';break;
    }
 
    $match=true;
 
   
//2.遍历要搜索的字符串$search,进行对比
    for($j=0;$j<$searchlen;$j++){
 
        if($str[$i+$j]!=$search[$j]){
            $match=false;
            break;
        }
        $k=$i+$j;
        if($match){
            if($j==$searchlen-1){
                echo "{$str}第{$i}个位置开始为{$search}\n";break;
            }
        }
    }
}
?>

希望本文所述对大家的PHP程序设计有所帮助。

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

初学正则表达式的时候都有一个疑问,例如:需要匹配串 "_abc_123_" 中 第一对"_"之间的字符,刚开始学习正则表达式的时候会写成 "/_w*_/",匹配的结果就是"abc_123" 而不是"abc"了;大神说加上一个问号,"/_w*?_/",这时候匹配的结果就是"abc"。

我们知道'?'单独使用的时候表示:重复零次或一次,而当'?'出现在重复限定符后面的,起的作用就是懒惰匹配,也就是匹配尽可能少的字符。懒惰限定符说明:

*?:重复任意次,但尽可能少重复
+?:重复1次或更多次,但尽可能少重复
??:重复0次或1次,但尽可能少重复
{n,m}?:重复n到m次,但尽可能少重复
{n,}?:重复n次以上,但尽可能少重复

对的,“尽可能少重复”,这就是对懒惰匹配的粗暴直白的解说。

那么怎么理解“尽可能少重复”呢?我们可以从正则表达式的忽略优先量词来解释了。
忽略优先量词

量词"*?"、"+?"、"??"、"{n,m}?"、"{n,}?"都属于忽略优先量词,忽略优先量词使用的是在?、+、*、{}后面添加?组成的,忽略优先在匹配的时候首先会尝试忽略,如果失败后回溯才会选择尝试。比如`ab??`匹配“abb”会得到‘a’而不是“ab”。当引擎匹配成功a后,由于是忽略优先,引擎首先选择不匹配b,继续查看表达式,发现表达式结束了,那么引擎就直接上报匹配成功。具体我们通过下面的例子一步一步说明忽略优先量词工作原理。
例子

还是上面的例子,用"/_w*?_/"匹配"_abc_123_" 中 第一对"_"之间的字符。

开始匹配第一个'_'之后,‘w*?’首先决定不需要匹配任何字符,因为它是忽略优先量词,这时候就拿表达式'/_w*?_/'中的第二个'_'('w*?'后面的'_')和目标串'_abc_123_'中的'a'匹配,匹配失败,这时候才会拿'w*?'去尝试未匹配的分支(使用w匹配a,尝试匹配a成功)

下一步,是尝试匹配,还是忽略呢?因为'w*?'是忽略优先量词,会选择忽略,那么就是重复上一步,'_'匹配b失败,'w*?'去尝试未匹配的分支ab,以上步骤总共重复了3次后(直到表达式'w*?'后面的'_'和目标串第二个'_'匹配),最终匹配出'abc'。

过程(开始匹配第一个'_'之后):

表达式/_w*?_/'中的第二个'_'和目标串'_abc_123_'中的'a'匹配,匹配失败,'w*?'尝试匹配目标串'_abc_123_'中的'a',匹配成功。
表达式/_w*?_/'中的第二个'_'和目标串'_abc_123_'中的'b'匹配,匹配失败,'w*?'尝试匹配目标串'_abc_123_'中的'ab',匹配成功。
表达式/_w*?_/'中的第二个'_'和目标串'_abc_123_'中的'c'匹配,匹配失败,'w*?'尝试匹配目标串'_abc_123_'中的'abc',匹配成功。
表达式/_w*?_/'中的第二个'_'和目标串'_abc_123_'中的'_'匹配,匹配成功,匹配结束。结果为abc。

以上是阅读《精通正则表达式》关于忽略优先量词一节的想法,如有不对虚心接受各位的指教,谢谢!

总结:当正则表达式和字符串函数都能解决问题时,一定要使用字符串函数,这样不容易出错,最重要的是字符串函数比正则表达式实现性能上要好得多。

[!--infotagslink--]

相关文章

  • OPPO R9s如何开启Real原声技术?OPPO R9s开启Real原声技术教程

    本篇文章介绍了OPPO R9s如何开启Real原声技术的方法,有需要的小伙伴可以进来看一看。 OPPO R9s如何开启Real原声技术?Real原声技术是R9s自带的音质提升技术,开启之后...2016-12-31
  • 学习动态网页PHP技术常见问题汇总解答

    1:为什么我得不到变量 我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值? 在PHP4.2以后的版本中reGISter_global默认为off 若想取得从另一页...2016-11-25
  • Illustrator绘制带指纹识别按钮图标教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一下绘制带指纹识别按钮图标的教程,各位想知道具体绘制方法的使用者们,那么下面就快来跟着小编一起看看教...2016-09-14
  • php 缓存技术实例

    本文章要讲的php 缓存技术是讲把数据生成一个临时缓存文件保存到硬盘,然后根据缓存文件设定的时间删除缓存文件再次生成新的缓存文件哦。 代码如下 复制...2016-11-25
  • 三种Web开发主流技术的评价之PHP

    PHP是一个什么原因出现的呢?它是一个技术人员希望能用一个快速的方面来完成他自己的个人主页中的一个小应用。而在他一发不可收时出现了php,它使一个人能在多种操作系统...2016-11-25
  • 网站追踪技术将用”帆布指纹识别”取代cookie

    网站或者广告联盟为了追踪用户访问记录,利用cookie是一个比较方便的技术实现,但是现在网民越来越关心cookie带来的隐私问题,那么现在一种新的技术“帆布指纹识别”或许可...2016-11-25
  • ThinkAjax中异步传输技术实现代码

    本实例介绍了在利用thinkajax中的无刷新技术来实例异步传输,有需要的朋友可以参考一下。 ThinkPHP的官方文档没有给出ThinkAjax的使用方法,令很多初学者使用起来有...2016-11-25
  • Web服务器识别技术揭秘

    但是Web服务器在配置方面很灵活,网关可以故意弄乱文件类型来隐藏关于所有技术方面的信息。识别服务器也是一门艺术,比如Java服务器所使用的服务页面(jsp)这种文件类...2016-01-27
  • PHP关于简单的页面缓冲技术

    其实说它为技术,也许不能说是真正的技术。这只不过是我自已想出来的页面处理的方法,当然与别人的想法可能是一致的。不过我还是想给它一个好听的名字。那么我这里所指的...2016-11-25
  • 简单的页面缓冲技术(1)

    前言   其实说它为技术,也许不能说是真正的技术。这只不过是我自已想出来的页面处理的方法,当然与别人的想法可能是一致的。不过我还是想给它一个好听的名字。...2016-11-25
  • 防尘防水不留指纹 美实验室卖薄膜新技术给三星

    网易科技讯9月27日消息,据国外每天报道,美国能源部橡树岭国家实验室(Oak Ridge National Laboratory)周一宣布,韩国三星电子已经获得其历时三年研发的超疏水(superhydrophobic)透明薄膜技术。该技术可被用于智能手机、平板电脑或其他设备的显示屏上,能极大的改善屏幕反光、防尘、防水以及留下污迹或指纹的表现。...2016-09-28
  • ADO.NET之连接池技术的使用详解

    本篇文章是对连接池技术的使用进行了详细的分析介绍,需要的朋友参考下...2021-09-22
  • 详细介绍.NET中的动态编译技术

    这篇文章详细介绍了.NET中的动态编译技术,有需要的朋友可以参考一下...2021-09-22
  • 安卓7.1.2正式版将于4月3日推送:加入指纹手势功能

    据外媒报道,谷歌可能在4月3日向支持的Nexus和Pixel设备推送Android 7.1.2 Nougat升级。据了解加拿大通信运营商Rogers计划于当天(4月3日)向Pixel用户推出VoLTE高清通话功能,...2017-07-06
  • PHP中使用memcache缓存技术提高响应速度详解

    php虽然己经做到很好很快了,但是如果大数据量时还是会有些卡了,下面我来给大家介绍PHP中使用memcache缓存技术提高响应速度方法,有需要了解的朋友可参考。 memcache...2016-11-25
  • php压缩技术

    GZIP(GNU-ZIP)是一种压缩技术。经过GZIP压缩后页面大小可以变为原来的30%甚至更小。这样用户浏览的时候就会感觉很爽很愉快! 要实现GZIP压缩页面需要浏览器和服务器共同...2016-11-25
  • 厂商合推SCA和SDO规范 增强SOA技术合作

    为了更好地推动SOA发展,BEA等数家正在合作创建服务组件架构(SCA)和服务数据对象(SDO)规范的领先技术厂商日前发布了多个重要成果,包括与SOA相关的规范和技术所取得的重要...2016-11-25
  • 聊天室技术 - 密谈的实现

    聊天室技术 - 密谈的实现 每个聊天室都提供了密谈功能,来为那些需要私下里进行交流的聊友提供方便,这 里把我的聊天室实现私聊的方法介绍如下: 1 对发送信息的处理...2016-11-25
  • 简单的页面缓冲技术(三)

    ontent.php3文件用来处理动态页面。用户可以通过content.php3?page=id号来读出一个数据文件。具体方法我就不说了,大家只要知道每个数据文件都有一个不同的id号,这样con...2016-11-25
  • iOS指纹识别的简单应用

    这篇文章主要为大家详细介绍了iOS指纹识别的简单应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-07-01