// 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 ← 替换动作本身不可见
})();