显然,由于最近的骗局,开发者工具被人们用来发布垃圾邮件,甚至被用来“黑客”账户。Facebook已经屏蔽了开发者工具,我甚至无法使用控制台。

他们是怎么做到的??一篇Stack Overflow的帖子声称这是不可能的,但Facebook已经证明他们错了。

只需转到Facebook并打开开发工具,在控制台中键入一个字符,就会弹出此警告。无论你投入什么,它都不会被执行。

这怎么可能?

他们甚至在控制台中阻止了自动完成:


当前回答

在内部,devtools将一个名为getCompletions的IIFE注入页面,当在devtools控制台内按下一个键时调用。

查看该函数的源代码,它使用了一些可以覆盖的全局函数。

通过使用Error构造函数,可以获得调用堆栈,当Devtools调用时,它将包括getCompletions。


例子:

const disableDevtools=回调=>{const original=Object.getPrototypeOf;Object.getPrototypeOf=(…args)=>{if(Error().stack.includes(“getCompletions”))callback();返回原始(…args);};};禁用开发工具(()=>{console.error(“devtools已禁用”);而(1);});

其他回答

Netflix也实现了这一功能

(function() {
    try {
        var $_console$$ = console;
        Object.defineProperty(window, "console", {
            get: function() {
                if ($_console$$._commandLineAPI)
                    throw "Sorry, for security reasons, the script console is deactivated on netflix.com";
                return $_console$$
            },
            set: function($val$$) {
                $_console$$ = $val$$
            }
        })
    } catch ($ignore$$) {
    }
})();

他们只是凌驾于控制台之上_commandLineAPI引发安全错误。

我无法在任何页面上触发它。更强大的版本可以做到这一点:

window.console.log = function(){
    console.error('The developer console is temp...');
    window.console.log = function() {
        return false;
    }
}

console.log('test');

设置输出样式:JavaScript控制台中的颜色

Edit Thinking@joeldixon66有正确的想法:从控制台禁用JavaScript执行«:::KSpace:::

我会这样做:

Object.defineProperty(window, 'console', {
  get: function() {

  },
  set: function() {

  }
});

这实际上是可能的,因为Facebook能够做到这一点。嗯,不是实际的web开发工具,而是在控制台中执行Javascript。

看看这个:Facebook如何禁用浏览器的集成开发工具?

但这真的没什么用,因为还有其他方法可以绕过这种类型的客户端安全性。

当你说它是客户端时,它发生在服务器的控制之外,所以你对此无能为力。如果你问Facebook为什么仍然这样做,这实际上不是为了安全,而是为了保护不懂javascript的普通用户,防止他们在控制台中运行代码(他们不知道如何读取)。这对于那个些承诺自动点赞服务或其他Facebook功能机器人的网站来说是很常见的,他们会在你们完成他们要求你们做的事情后,给你们一小段javascript,让你们在控制台中运行。

如果你没有Facebook那么多的用户,那么我认为没有必要做Facebook正在做的事情。

即使在控制台中禁用Javascript,也可以通过地址栏运行Javascript。

如果浏览器在地址栏禁用javascript,(当你在Google Chrome中将代码粘贴到地址栏时,它会删除短语“javascript:”)仍然可以通过inspect元素将javascript粘贴到其中一个链接中。

检查锚固件:

在href中粘贴代码:

底线是服务器端验证和安全性应该首先进行,然后再进行客户端验证。

在内部,devtools将一个名为getCompletions的IIFE注入页面,当在devtools控制台内按下一个键时调用。

查看该函数的源代码,它使用了一些可以覆盖的全局函数。

通过使用Error构造函数,可以获得调用堆栈,当Devtools调用时,它将包括getCompletions。


例子:

const disableDevtools=回调=>{const original=Object.getPrototypeOf;Object.getPrototypeOf=(…args)=>{if(Error().stack.includes(“getCompletions”))callback();返回原始(…args);};};禁用开发工具(()=>{console.error(“devtools已禁用”);而(1);});