控制台输出检测|拦截 dom 属性触发反调试
下面这段代码会导致打开控制台的时候跳转到空白页
不打开控制台就不会触发 <script> 标签
<!doctype html>
<html lang="en">
<script>
var x = document.createElement("div"); // 创建一个空的div元素
Object.defineProperty(x, "id", {
get: function () {
// 给x的id属性定义一个"读取时触发的函数"
window.location = "about:blank"; // 触发时跳转空白页
window.threshold = 0;
},
});
alert("触发反调试,跳转空白页");
console.info(x); // 输出x到控制台
</script>
</html>
要理解这种反调试手段,首先需要明确浏览器控制台的一个关键行为:当控制台输出 DOM 元素时,会主动读取元素的核心属性以展示详细信息。
例如,当我们执行 console.log(document.createElement('div')) 并打开控制台时,会看到类似div的输出(若元素有id,则显示 div #xxx )
对于上面的代码:
- 控制台关闭时:
console.info(x)虽然执行,但浏览器无需展示输出内容,因此不会读取x的id属性,get方法不触发。 - 控制台打开时:浏览器必须渲染 x 的信息,那就必然会读取
id属性,触发get方法中的反调试逻辑