讯飞星火认知大模型web端打开控制台就跳转空白页防debugger技术分析学习(二)

前言

分析

  • 代码是如何判断用户是否打开了devtool开发工具呢,肯定需要某种特征

第一种

  • 容易想到的,如果,devtool 是嵌入到页面中的,打开时页面的宽高 发生变化,我们就可以监听窗口size 事件,来触发ondevtoolopen方法
  • 下面来复现下
  1. 首先要调成devtool嵌入模式

2. 进行栈回溯,可以看到,对窗口进行了检测,具体的检测窗口变化代码在函数checkWindowSizeUneven,请自行分析

第二种

  • 如果devtool ,没有嵌入到页面,这样找开的时间,size事件是不是就监听不到了呢,那要如何来检测呢
  • 下面调成devtool非嵌入模式来复现下
  • 可以看到onDevToolOpen 打开前有一个判断条件t > 10 * this.maxPrintTime 这个就是用来判断是否打开了devtool,下面摘出代码:
js 复制代码
{
    key:"detect",
    value:function() {
        var e = this
        , t = g((function() {
        I(e.largeObjectArray)
        }
        ))
        , n = g((function() {
        D(e.largeObjectArray)
        }
        ));
        if (this.maxPrintTime = Math.max(this.maxPrintTime, n),
        M(),
        0 === t || 0 === this.maxPrintTime)
            return !1;
        t > 10 * this.maxPrintTime && this.onDevToolOpen()
    }
}
  • t > 10 * this.maxPrintTime ,又因为his.maxPrintTime = Math.max(this.maxPrintTime, n)只需要判断t 和10倍n 关系即可,下面分析tn怎么等到的:
js 复制代码
t = g((function() {
    I(e.largeObjectArray)
}
))

n = g((function() {
    D(e.largeObjectArray)
}
))

function m() {
    return (new Date).getTime()
}
function g(e) {
    var t = m();
    return e(),
    m() - t
}
  • 可以看到二者都是通过同一个g 得出的,里面函数内部执行了I 函数和D函数
  • g 函数内部执行e参数,也就是执行I D 函数,g的返回值就是一个执行代码的时间差值
  • 在执行I 函数控制台会打印出一个数组表格 ,肯定就是I函数打印的
  • 把鼠标悬在I 函数发现name为tableconsole.table对比,是同一个
  • D函数同理
  • 打印的值就是e.largeObjectArray ,控制台输出e.largeObjectArray是一个二维数组
  • 可以先出结论,判断控制台打开条件就是console.table 打印耗费的时间大于console.log10倍即可,两者关系不打开控制台的情况下我没对比过,暂时没想出怎么对比,欢迎留言

总结

  • 通过分析学习,我们可以使用这两种方法来检测debugger
  1. 监听窗口的size事件
  2. 通过输出一个复杂的二维数组,比较console.tableconsole.log执行时间

待续

  • 百度的文心一言采用了更高级防degguer白屏模式,如果后续呼声高了,就继续分析学习
相关推荐
CappuccinoRose8 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
全栈前端老曹8 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
Loo国昌8 小时前
【大模型应用开发】第六阶段:模型安全与可解释性
人工智能·深度学习·安全·transformer
乾元8 小时前
终端安全(EDR):用深度学习识别未知勒索软件
运维·人工智能·网络协议·安全·网络安全·自动化·安全架构
NCDS程序员8 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
安科瑞刘鸿鹏178 小时前
高速路灯故障难定位?用 ASL600 实现精确单灯监测与维护预警
运维·网络·物联网·安全
小杨同学呀呀呀呀9 小时前
Ant Design Vue <a-timeline>时间轴组件失效解决方案
前端·javascript·vue.js·typescript·anti-design-vue
qq_532453539 小时前
使用 Three.js 构建沉浸式全景图AR
开发语言·javascript·ar
Mr Xu_17 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠17 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript