如何解决toString检测?
对于 一些浏览器环境检测时,比较常见的toString方法检测,查看函数方法是否修改,从而来检测爬虫行为,以下是一种过toString检测的方法。
1、修改toString方法。
代码如下:
(() => {
"use strict";
const $toString = Function.toString();
const myFunction_toString_symbol = Symbol('('.concat('',')_', (Math.random() + '').toString(36)));
const myToString = function(){
return typeof this == 'function' && this[myFunction_toString_symbol] || $toString.call(this);
};
function set_native(func, key, value){
Object.defineProperty(func, key, {
"enumerable": false,
"configurable": true,
"writable": true,
"value": value
})
};
delete Function.prototype['toString']; // 删除原型链上的toString
set_native(Function.prototype, "toString", myToString); // 自己定义个getter方法
set_native(Function.prototype.toString, myFunction_toString_symbol, "function toString() { [native code] }"); // 套个娃 保护一下我们定义的toString 否则就暴露了
this.func_set_native = (func) => {
set_native(func, myFunction_toString_symbol, `function ${myFunction_toString_symbol,func.name || ''}() { [native code] }`);
}; // 导出函数到globalThis
}).call(this);
2、修改指定的toString函数
window.open = function open(){}
3、调用修改测试
this.func_set_native(window.open)
console.log(window.open.toString())
结果如下: