瑞数5补环境要点

  1. 一、前言
  2. 二、目标
  3. 三、成果
  4. 四、与4代环境的主要差异
    1. 4.1 document.all检测
    2. 4.2 form标签检测
    3. 4.3 音视️频指纹检测
  5. 五、总结

一、前言

之前分析过瑞数4的补环境方案,本篇分析一下瑞数5,一开始笔者试图直接拿瑞数4的环境来运行瑞数5,但请求失败了,cookie也不一致,这说明rs5在rs4的基础上多了一些环境检测点。

本篇的目的即是将这些新增的检测点找出来, 方案选择补环境框架。(瑞数6拿瑞数5的环境可以直接过)

二、目标

成功爬取首页html。

aHR0cDovL3d3dy5jaGluYXN0b2NrLmNvbS5jbi9uZXdzaXRlL2Nncy1zZXJ2aWNlcy9zdG9ja0ZpbmFuY2UvYnVzaW5lc3NBbm5jLmh0bWw/dHlwZT1tYXJnaW5MaXN0

三、成果

200返回
cookie一致

四、与4代环境的主要差异

4.1 document.all检测

代理日志

特性

从图中可以看出,返回的是一个HTMLALLCollection对象,但用typeof却显示undefined

分析与解决

这其实是javascript发展史上的一个bug,并且官方也不推荐使用该api

在js层面这个对象是无法模拟出来的,不过有大佬提出用c++更改nodejs底层代码,或者用c++写一个nodejs插件,笔者这里用的是后者。

4.2 form标签检测

代理日志

特性
在浏览器中form标签的特征可用下面这个案例来表示:

function test_action() {
    let form = document.createElement("form");
    let input1 = document.createElement("input");
    input1.id = "username";
    input1.content = "action";
    input1.name = "action";
    form.appendChild(input1);
    let input2 = document.createElement("input");
    input2.name = "textContent";
    input2.id = "password";
    form.appendChild(input2);
    let input3 = document.createElement("input");
    input3.id = "innerText";
    input3.type = "submit";
    input3.name = "id";
    form.appendChild(input3);
    a = form.action;
    b = form.textContent;
    c = form.id;
    d = form.innerText;
    form.id='yq'
    form.name='yqName'
    document.body.appendChild(form)
    
    if (a.name == 'action' && a.id == 'username' && b.name == 'textContent' && b.id == 'password' && c.id == "innerText" && c.name == 'id' && d.id == 'innerText' && d.name == 'id' &&globalThis.yq==form &&globalThis.yqName==form) {
        console.log(`test_action 检测通过`)
    } else {
        console.log(`test_action 可以被检测`);
    }

}

test_action()

浏览器测试结果:

简要概括一下,对于一个form标签,如果添加一个input子标签,并且input设置了id和name值,那么form标签可以直接通过id和name访问到这个input标签,此为第一层;
第二层是若form标签设置了id和name,那么对于window对象及其原型链,可以直接通过id和name访问到这个form标签。

分析和解决
这个问题通过js设计解决,在input标签插入form标签的过程中,检查input标签是否有id/name标签,如果有,那么给form标签自身添加id/name值属性,指向input标签;在form标签添加到body中时,给window的原型链添加id/name值属性,指向form标签。

4.3 音视️频指纹检测

代理日志

检测原理
通过创建audio/video标签,调用其canPlayType方法,传入不同的参数以验证浏览器支持情况。
解决
缺啥补啥,和浏览器保持一致就行。

五、总结

以上就是5代瑞数环境检测和4代的区别,主要包括3点:

  1. document.all检测,这个检测难以通过纯js解决,需要对v8有所了解,需要会一点c++的基础从底层实现。
  2. form标签检测,调试好规律后在js中做一些嫁接引用 。
  3. 音视频指纹检测,和浏览器保持一致就行。

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,如有问题请邮件至2454612285@qq.com。
跃迁主页