JS 禁止打开控制台的脚本 禁止debugger 状态

13 min read
((function() {
    var callbacks = [],
        timeLimit = 50,
        open = false;
    setInterval(loop, 1);
    return {
        addListener: function(fn) {
            callbacks.push(fn);
        },
        cancleListenr: function(fn) {
            callbacks = callbacks.filter(function(v) {
                return v !== fn;
            });
        }
    }

    function loop() {
        var startTime = new Date();
        debugger;
        if (new Date() - startTime > timeLimit) {
            if (!open) {
                callbacks.forEach(function(fn) {
                    fn.call(null);
                });
            }
            open = true;
            window.stop();
            document.body.innerHTML = "";
        } else {
            open = false;
        }
    }
})()).addListener(function() {
    window.location.reload();
});

简单来说,当你打开开发者工具时,这段代码会进入 debugger; 状态,从而让浏览器暂停。此外,如果检测到从进入 debugger; 到执行后面代码的时间超过了一个设定的时间阈值,它会认为开发者工具是打开的,并执行某些反应,如重载页面或清空页面内容。

这段代码的工作原理如下:

  1. 定义一个立即执行的匿名函数,其中有一个不断循环的 setInterval
  2. 在循环中,它首先获取当前时间 startTime
  3. 然后执行 debugger; 语句,这会让浏览器暂停,只有当开发者工具打开时才有效。
  4. 如果从执行 debugger; 到获取新的时间间隔超过了设定的 timeLimit,它就会假设开发者工具是打开的,并执行在 callbacks 数组中的所有回调函数。
  5. 在给出的例子中,它添加了一个回调函数,该函数会重载页面。

所以,当你打开开发者工具并且代码进入 debugger; 状态时,如果你没有在 50 毫秒内恢复代码执行,页面就会重载。

这种方法确实可能会给开发者带来一些困扰,特别是当他们想要检查或修改页面内容时。但同时,它也可以在某种程度上保护网站的代码不被轻易查看或篡改。

要绕过这种防护机制,您可以考虑以下方法:

  1. 禁用JavaScript:这是最简单和最直接的方法。但这样可能会导致网页的某些功能无法正常工作。

  2. 从源代码中移除防护代码

    1. 打开浏览器,但不打开开发者工具。
    2. 使用浏览器的“查看源代码”功能查看页面的源代码。
    3. 找到与上述代码相似的部分并手动删除或注释掉它。
    4. 将修改后的代码保存到本地,并从本地打开。
  3. 使用断点

    • 打开开发者工具后,立即在 debugger; 语句前设置一个断点。这样可以在执行到 debugger; 之前暂停代码。
    • 一旦代码暂停,您可以手动更改或删除相关代码,然后继续执行。
  4. 修改 timeLimit:如果您能快速操作,可以试着在代码进入 debugger; 之前修改 timeLimit 的值,使其非常大,例如设置为一小时。这样即使打开了开发者工具,检测也不会触发。

  5. 使用浏览器扩展或插件:有些扩展或插件可能允许您更轻松地绕过此类防护机制。

  6. 修改浏览器的内部行为:如果您对浏览器的开发有深入的了解,可以尝试修改浏览器的源代码或使用特殊版本的浏览器来避免 debugger; 的暂停效果。

但请注意,尝试破解或绕过网站的安全机制可能违反法律或服务条款。在进行任何此类操作之前,请确保您有权这样做并了解可能的法律后果。