很多时候我们做反爬虫都会建立ip黑名单,防止爬虫抓取信息,但是道高一尺魔高一丈;爬虫会使用代理ip跟拨号服务器去抓取内容;这是我们就会使用前端js生成类似浏览器指纹+代码混淆,来判断爬虫;除了浏览器指纹;
啥是浏览器指纹?就是说不同电脑的浏览器生成的指纹数值是不一致的;常用的指纹有Canvas指纹;webgl指纹;硬件指纹;AudioContext指纹;
类似:canvas指纹:https://browserleaks.com/canvas
以下是 canvas指纹算法实现:
function hashstr(s){
var hash = 0;
if (s.length == 0) return hash;
for (i = 0; i < s.length; i++) {
char = s.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
// 使用canvas绘图,并返回图片的Base64码对应的hash值
// 摘自http://t.cn/AiFHoZGV
function getCanvasFp() {
var result = "";
// Very simple now, need to make it more complex (geo shapes etc)
var canvas = document.createElement('canvas');
canvas.width = 2000;
canvas.height = 200;
canvas.style.display = 'inline';
var ctx = canvas.getContext('2d');
// detect browser support of canvas winding
// http://t.cn/R7wzrRy
// http://t.cn/AiFHoZG5
// console.info(ctx.rect)
ctx.rect(0, 0, 10, 10);
ctx.rect(2, 2, 6, 6);
console.info(ctx.isPointInPath(5, 5, 'evenodd'))
result += 'canvas winding:' + ((ctx.isPointInPath(5, 5, 'evenodd') === false) ? 'yes' : 'no');
ctx.textBaseline = 'alphabetic';
ctx.fillStyle = '#f60';
ctx.fillRect(125, 1, 62, 20);
ctx.fillStyle = '#069';
// http://t.cn/AiFHoZGx
ctx.font = '11pt no-real-font-123';
ctx.fillText('Cwm fjordbank glyphs vext quiz, \ud83d\ude03', 2, 15);
ctx.fillStyle = 'rgba(111, 204, 0, 0.2)';
ctx.font = '18pt Arial';
ctx.fillText('Cwm fjordbank glyphs vext quiz, \ud83d\ude03', 4, 45);
// canvas blending
// http://t.cn/AiFHoZGt
// http://t.cn/AiFHoZGM
ctx.globalCompositeOperation = 'multiply';
ctx.fillStyle = 'rgb(255,0,255)';
ctx.beginPath();
ctx.arc(50, 50, 50, 0, Math.PI * 2, true);
ctx.closePath();
ctx.fill();
ctx.fillStyle = 'rgb(0,255,255)';
ctx.beginPath();
ctx.arc(100, 50, 50, 0, Math.PI * 2, true);
ctx.closePath();
ctx.fill();
ctx.fillStyle = 'rgb(255,255,0)';
ctx.beginPath();
ctx.arc(75, 100, 50, 0, Math.PI * 2, true);
ctx.closePath();
ctx.fill();
ctx.fillStyle = 'rgb(255,0,255)';
// canvas winding
// http://t.cn/R7wzrRy
// http://t.cn/AiFHoZGf
ctx.arc(75, 75, 75, 0, Math.PI * 2, true);
ctx.arc(75, 75, 25, 0, Math.PI * 2, true);
ctx.fill('evenodd');
if (canvas.toDataURL) {
result += ';canvas fp:' + canvas.toDataURL();
}
// console.info(canvas.toDataURL)
// console.info(result)
return hashstr(result);
}
console.info(getCanvasFp())
除了指纹,还有webrtc;显卡信息;电池信息;cpu;内存;font校验;plugin;字符串正则正则校验;digest前后端签名校验;等等都可以作为前端js反爬或者反刷的手段;
字体校验(百度商桥其中一项验证算法)
var Detector = function() {
// a font will be compared against all the three default fonts.
// and if it doesn't match all 3 then that font is not available.
var baseFonts = ['monospace', 'sans-serif', 'serif'];
//we use m or w because these two characters take up the maximum width.
// And we use a LLi so that the same matching fonts can get separated
var testString = "haoroomstestfonts";
//we test using 72px font size, we may use any size. I guess larger the better.
var testSize = '72px';
var h = document.getElementsByTagName("body")[0];
// create a SPAN in the document to get the width of the text we use to test
var s = document.createElement("span");
s.style.fontSize = testSize;
s.innerHTML = testString;
var defaultWidth = {};
var defaultHeight = {};
for (var index in baseFonts) {
//get the default width for the three base fonts
s.style.fontFamily = baseFonts[index];
h.appendChild(s);
defaultWidth[baseFonts[index]] = s.offsetWidth; //width for the default font
defaultHeight[baseFonts[index]] = s.offsetHeight; //height for the defualt font
h.removeChild(s);
}
function detect(font) {
var detected = false;
for (var index in baseFonts) {
s.style.fontFamily = font + ',' + baseFonts[index]; // name of the font along with the base font for fallback.
h.appendChild(s);
var matched = (s.offsetWidth != defaultWidth[baseFonts[index]] || s.offsetHeight != defaultHeight[baseFonts[index]]);
h.removeChild(s);
detected = detected || matched;
}
return detected;
}
this.detect = detect;
};
//获取系统所有字体
var getFonts = function() {
console.info(11111111111)
var fontArray = ['Samsung Telugu', 'VivoFont', 'ComingSoon', 'SmartZawgyi', 'HTCHand', 'hifont', 'Chococooky', 'slim', 'LockClock', 'FangZhengLTH', 'ifont', 'Cour', 'whatsfont', 'lthjt', 'Amazon Thin', 'iphoneLockClock', 'UIFont', 'mylikefonts', 'Clockopia', 'AndroidClock', 'UDMincho', 'Rosemary', 'fzmwfull', 'Verdana', 'Times', 'ArialMT', 'Zapfino', 'AppleGothic'];//所有字体列表枚举
var fontString = "";
var _ = new Detector();
for (var i = 0; i < fontArray.length; i++) {
_.detect(fontArray[i])&&(fontString +=fontArray[i]+ ", ")
}
return fontString.length>0&&(fontString = fontString["substr"](0,fontString.length-2))
,fontString;
}
//判断是否存在某个字体
isFont = function(font) {
return new Detector().detect(font);
}
console.info(getFonts())
分享到:
相关推荐
基本指纹追踪涉及的特征包括但不限于硬件类型、操作系统、用户代理(Useragent)、系统字体、语言、屏幕分辨率、浏览器插件(如Flash、Silverlight、Java等)、浏览器扩展、浏览器设置(例如Do-Not-Track)、时区...
为了提高匿名性,我们可能需要改变一些浏览器指纹的组成部分。CEFSharp虽然没有直接提供修改指纹的API,但可以通过JavaScript注入或者使用第三方库来实现,比如FingerprintJS。 1. JavaScript注入:在加载页面之前...
如何使用候鸟浏览器修改浏览器指纹
指纹修改工具,适合火狐,谷歌浏览器
该方法可以将浏览器的各种特征,如浏览器类型、操作系统、屏幕分辨率等,合并成一个唯一的指纹信息,以便更好地识别用户。 浏览器指纹识别算法是指纹技术的核心部分,该算法可以通过计算浏览器指纹信息熵和相似度来...
在如今,做安全防御已经不仅仅是被动的等着攻击者攻击,作为防御⽅,有越来越多的⽅法去反击攻击者,甚⾄给攻击者⼀些威胁。 设备指纹技术是⼀种⻓久有效的追踪技术,即使攻击者挂再多 vpn,也能够准确识别攻击者...
在JavaScript代码中调用browser-fingerprintjs库的get方法,获取浏览器指纹
Python基于浏览器指纹的暗网网址检测系统源码.zip
本文介绍了一种基于双向循环神经网络的安卓浏览器指纹识别方法,该方法可以对安卓浏览器进行指纹识别,以便更好地服务于广告投放和用户行为分析等领域。 浏览器指纹识别是一种用户身份识别方法,自2010年提出以来,...
浏览器指纹是通过收集用户的浏览器设置、插件信息、屏幕分辨率、时区、语言设置、字体集等信息,生成的一个独特标识。这些信息组合起来往往比简单的IP地址更能准确地标识用户,因为IP地址可能因使用代理或公共Wi-Fi...
相比之下,指纹对用户是不可见的,不会在浏览器上留下任何痕迹,因此难以检测和预防,是一种强大的识别手段。 fybridjs首先利用以下 Web 技术通过浏览器收集信息并为浏览器生成唯一标识符 [1]: 浏览器内置 ...
Node.js应用程序获取浏览器指纹。 依存关系 快速,简单,极简的Web框架 该模块尝试通过检查浏览器的标头和连接信息来唯一标识浏览器。 为什么这个? 该脚本用作内部端点,可为请求该脚本的客户端提供“浏览器指纹...
浏览器指纹Demo 知乎文章: 在线演示地址: 你应该知道的事 Chrome一直在阻止网页技术捕获用户的指纹,这是出于对于用户隐私与安全性的考虑,所以现在可用的技术可能在未来的某个版本中就不可用了。但是浏览器指纹...
VMLogin可在同一个电脑上生成多个物理隔离并且防关联的反指纹浏览器,通过模拟电脑或手机设备的软硬件指纹信息,使得每个浏览器文件的Cookies、本地存储和其他缓存文件将被完全隔离,浏览器配置文件之间无法相互泄漏...
指纹浏览器是一种特殊的网络浏览工具,它通过改变用户的网络行为特征,即所谓的“指纹”,来保护用户的隐私和防止在线身份被追踪。在电商领域,特别是跨境电商中,这种浏览器的应用尤为重要,因为商家经常需要管理多...
VMLogin指纹浏览器V1.2.8.1版本最新安装包:https://www.vmlogin.cc/
在浏览器指纹识别领域,Python的库如FingerprintJS和BrowserLeaks等可以方便地收集和处理浏览器的各种信息。 浏览器指纹主要包括以下几个方面: 1. **用户代理(User-Agent)**:这是浏览器发送到服务器的一个字符...
最近换了一些硬件设备,这种指纹机不用了,看了看精易没有相关的项目,就写了个例子。SDK并没有提供源码,而是编译好的二进制静态库 驱动安装后也提供了相应的COM控件,但是我不太喜欢用。对于线下的门禁,支付,...
4. **浏览器指纹检测**:浏览器指纹是通过收集用户的浏览器配置、插件、分辨率等信息,形成一个独特的标识,用于识别和追踪用户,即使他们更换了IP地址或者使用了匿名浏览模式。为了应对这种追踪,项目可能包含了...