爬虫逆向:环境检测基本功

检测属性长度,根据长度判断数据是否正确
location = {}
location.href = 'https://www.baidu.com'


function ps() {
    if (location['href'].length > 3) { // 检测属性长度,根据长度判断数据是否正确
        return 'hello world'
    } else {
        return '失败'
    }
}

console.log(ps());
检测代码执行环境是否存在navigator
// 检测代码执行环境是否存在navigator
navigator = {}
navigator.userAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'

function ps() {
    if (navigator['userAgent']) {
        return 'hello world'
    } else {
        return '失败'
    }
}

console.log(ps());

异常捕获打印日志信息

location = {}
location.host = '8888'
navigator = {}
navigator.userAgent = 'asd'

function pn() {
    try {
        console.log(verify_local());
        if (navigator['userAgent']) {
            return 'hello world'
        }
    } catch (e) {
        console.log(e)  // 输出错误日志
        return '错误的数据'
    }
}

function verify_local() {
    if (location.host.length > 2) {
        return '浏览器环境...'
    }
    return '非浏览器环境...'
}

console.log(pn());
判断浏览器执行环境与node执行环境来验证是否为爬虫程序
// 浏览器和node差异
let browser_or_node = "undefined" != typeof exports ? exports : void 0
console.log(typeof browser_or_node);

// global检测
let glb = "undefined" == typeof window ? global : window
console.log(glb)

吐环境的脚本

function getEnv(proxy_array) {
    for (let i = 0; i < proxy_array.length; i++) {
        handler = `{
            get: function(target, property, receiver) {
                   console.log('方法:get','    对象:${proxy_array[i]}','    属性:',property,'    属性类型:',typeof property,'    属性值类型:',typeof target[property]);
                   return target[property];
            },
            set: function(target, property, value, receiver){
                    console.log('方法:set','    对象:${proxy_array[i]}','    属性:',property,'    属性类型:',typeof property,'    属性值类型:',typeof target[property]);
                    return Reflect.set(...arguments);
            }
        }`;
        eval(`
            try {
                ${proxy_array[i]};
                ${proxy_array[i]} = new Proxy(${proxy_array[i]}, ${handler});
            } catch (e) {
                ${proxy_array[i]} = {};
                ${proxy_array[i]} = new Proxy(${proxy_array[i]}, ${handler});
            }
        `);
    }
}

proxy_array = ['window', 'document', 'location', 'navigator', 'history', 'screen','ctx.fillRect']


getEnv(proxy_array);

根据上面的脚本将环境补全小案例

window = global


window.addEventListener = function(){}
kw = {
    getAttribute:function(){}
}
ctx = {
    fillRect:function(){}
}

canvas = {
    getContext:function(){
            return ctx
    }
}
document = {
    getElementById:function(id){
        if(id ==='kw'){
            return kw
        }
    },
    createElement:function(tagName){
        if(tagName === 'canvas'){
            return  canvas
        }
    }
}
navigator = {
    toString:function(){
        return '[object Navigator]'
    }
}


function get_sign() {
    window.addEventListener("test")
    let kw = document.getElementById("kw")
    let _class = kw.getAttribute("class")
    let canvas = document.createElement("canvas")
    let ctx = canvas.getContext("2d");
    ctx.fillRect(10, 10, 100, 100);

    try {
        if (navigator.toString() === '[object Navigator]') {
            return btoa("admin")  // 输出base64编码
        } else {
            return '假数据 - 1'
        }
    } catch (e) {
        return '假数据 - 2'
    }
}

console.log(get_sign())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值