eval 检测




// eval 检测原理 demo —— 复制到浏览器控制台直接运行
// 预期输出: 42 / ReferenceError / true / false / false / true
(() => {
  // 1) 基础: 直接 eval 看得到局部变量, 间接 eval 看不到
  (function () {
    var secret = 42;
    console.log("直接 eval 读局部变量:", eval("secret")); // 42
    var e = eval;
    try { e("secret"); } catch (err) {
      console.log("间接 eval 报错:", err.name);            // ReferenceError
    }
  })();

  // 探针: 把 this 绑到一个非全局对象, 看 eval("this") 返回谁
  const probe = () => (function () { return eval("this") === this; }).call({});

  // 2) 无钩
  console.log("无钩 探针:", probe()); // true

  // 3) 换上包装器(eval 钩子的形状, 浏览器/node 通用)
  const _eval = globalThis.eval;
  globalThis.eval = function (code) { return _eval(code); };
  console.log("有钩 探针:", probe()); // false ← 被检测(直接语义被偷换成间接, this 变 window)

  // 4) 把原函数原样赋回去
  globalThis.eval = _eval;
  console.log("复原 探针:", probe()); // true ← 替换动作本身不可见
})();


posted @ 2026-10-08 13:35  AngDH  阅读(1)  评论(0)    收藏  举报