爬虫检测技术之指纹识别、canvas指纹

现行的网络爬虫检测技术中,主要有以下两大类:

  • 行为检测
  • 指纹识别

(1)行为检测:通过分析网页上用户的操作(鼠标的移动、点击、滚动行为和浏览行为)来判断操作者是否是机器控制的网络爬虫。

(2)指纹识别:通过分析设备和浏览器的信息来判断访问者是否为网络爬虫。

每一台电脑、每一个操作系统、每一个浏览器,都有属于它自己的设备信息。比如电脑的CPU数量、显卡型号、操作系统的位数、浏览器的版本等。

将这些设备信息加以组合,就可以作为请求者的指纹来进行识别。

fpscanner会对传入的浏览器指纹项进行识别和判断,最终给出三个结果:

  • 一致:表示为检测到任何可疑;
  • 不确定:表示检测的指纹可以是爬虫,也有可能不是爬虫;
  • 不一致:表示检测的指纹是爬虫

Selenium 中 通过execute_cdp_cmd()方法,也能够将webdriver标记给去除掉。

canvas指纹

每一种浏览器都会使用不同的图像处理引擎,不同的导出选项,不同的压缩等级,所以每一台电脑绘制出的图形都会有些许不同,这些图案可以被用来给用户设备分配特定编号(指纹),也就是说可以用来识别不同用户,一般情况下用户不会去更换硬件设备,所以canvas可以很好的指定当前用户的浏览器,但是当多个用户的硬件设备,浏览器一致时就特别容易产生相同的指纹,所以canvas指纹并不能完全的替代cookie作为用户的身份验证,但是可以作为辅助的验证信息。

识别范围:浏览器

用途:辅助用户验证消息

缺点:原始的实现的方法在同一硬件设备同一浏览器容易重复

原始实现方法:

var canvas = document.createElement('canvas');

var ctx = canvas.getContext("2d");

ctx.font = "24px Arial";

ctx.fillText("carnoc",22,33);

ctx.moveTo(0,0);

ctx.lineTo(100,100);

ctx.stroke();

var b64 = canvas.toDataURL().replace("data:image/png;base64,","");

return hex_md5(b64)//这里又md5啦,md5后的识别码就是我们需要的唯一设备号

通过定义相同的canvas行为产生一个base64的数据,但是由于base64的数据不好存储这里使用js-md5进行编码

问题:这样简易的canvas指纹在相同设备相同浏览器中重复率极高,所以要综合其他因素进行判断这里有一个改进版的库,里面的判断因素包括:

  1. 浏览器http请求中的用户代理-navigator.userAgent
  2. 浏览器的语言(中文、英文……)-navigator.language
  3. 设备屏幕的色彩信息-screen.colorDepth
  4. 设备屏幕的宽高-screen.height screen.width
  5. 格林威治时间和本地时间之间的时差-Date().getTimezoneOffset()
  6. 是否支持sessionStorage-window.sessionStorage
  7. 是否支持localStorage-window.localStorage
  8. 是否支持indexdDB-window.indexedDB
  9. 是否支持-docment.body.addBehavior(IE5的一个属性)
  10. 是否支持调用本地数据库-window.openDatabase
  11. 浏览器所在系统的CPU等级-navigator.cupClass
  12. 客户端的操作系统-navigator.platform
  13. 是否支持Do not track功能-navigator.doNotTrack
  14. 获取浏览器部分插件信息-flash plugin、Adobe PDF reader、QuickTime、real players、ShockWave player、Windows media player、Silverlight、Skype
  15. canvas指纹

网传的测试结果:

1.由于涉及设备以及浏览器的判定因素非常多,重复性很低,31台设备皆无重复

但是可以设想,毕竟是通过各种属性值去判断唯一性,理想情况下如果两台设备相同浏览器各种设置也相同,还是会出现重复

2.也正因为涉及的因素多,一旦设备系统更新 or 浏览器版本更新 or 浏览器关键插件有变化(版本更新 or 新增卸载关键插件) ,生成的ID都会改变,由于浏览器版本更新还是比较频繁的,很容易失去之前跟踪的用户

存储设备码

第一步的用户的唯一设备号已经有了那么我们如何进行安全永久(脆弱)的保存呢?

我使用的是cookie+localStorage进行保存的

cookie有一个好处,是可以在二级域名下共享cookie的如m.baidu.com和news.baidu.com,而本地缓存则做不到这样就顺便解决了同二级域名共享一个设备号的需求。

主要思路:

获取的设备号存cookie,同时存本地缓存localStorage
若检查到本地缓存的设备号与cookie不一致,以cookie为准,同时更新本地缓存并把更改信息提交至后台
每次进行访问时检查cookie和本地缓存有一个被清除了就使用另一个的设备号进行恢复
本地和cookie都没有的话只能重新生成一个设备号进行存储了(我也很绝望啊)
收集信息且提交

经过第二步我们知道了如何生成设备号和存储设备号了那么就应该进入第三步收集信息的环节了

具体要收集哪些信息看你的需求了(反正能得到的信息本来也不多)r如:设备分辨率,地理信息(移动端且开了GPS),浏览的网页url,浏览时间等等,最后将你得到和信息和设备号hashid传到后台吧

要进行一次匿名用户信息一般需要三部

1:生成唯一设备码

2:收集信息

3:存储提交

 

原文链接:https://blog.csdn.net/qq_38363903/article/details/96742297

posted @ 2021-04-02 11:46  Eliphaz  阅读(1770)  评论(0编辑  收藏  举报