Facebook 如何禁用浏览器的集成开发者工具?

因此,显然由于最近的骗局,开发人员工具被人们利用来发布垃圾邮件,甚至用于“破解”帐户。Facebook已经屏蔽了开发者工具,我甚至不能使用控制台。

Enter image description here

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

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

这怎么可能?

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

Enter image description here


答案 1

我是Facebook的安全工程师,这是我的错。我们正在为一些用户测试这一点,看看它是否可以减缓一些攻击,在这些攻击中,用户被诱骗将(恶意)JavaScript代码粘贴到浏览器控制台中。

需要明确的是:试图阻止黑客客户端通常是一个坏主意;这是为了防止特定的社会工程攻击

如果您最终进入了测试组并对此感到恼火,很抱歉。我试图使旧的选择退出页面(现在是帮助页面)尽可能简单,同时仍然足够可怕,以阻止至少一些受害者。

实际代码与@joeldixon66的链接非常相似;我们的没有充分的理由有点复杂。

Chrome 会将所有控制台代码包装在

with ((console && console._commandLineAPI) || {}) {
  <code goes here>
}

...所以网站重新定义抛出:console._commandLineAPI

Object.defineProperty(console, '_commandLineAPI',
   { get : function() { throw 'Nooo!' } })

还不够(试试吧!),但这是主要的技巧。


结语:Chrome团队认为从用户端JS击败控制台是一个错误,并修复了这个问题,使这种技术无效。之后,添加了额外的保护来保护用户免受自我xss的侵害


答案 2

我使用Chrome开发人员工具找到了Facebook的控制台buster脚本。下面是为提高可读性而进行细微更改的脚本。我已经删除了我无法理解的位:

Object.defineProperty(window, "console", {
    value: console,
    writable: false,
    configurable: false
});

var i = 0;
function showWarningAndThrow() {
    if (!i) {
        setTimeout(function () {
            console.log("%cWarning message", "font: 2em sans-serif; color: yellow; background-color: red;");
        }, 1);
        i = 1;
    }
    throw "Console is disabled";
}

var l, n = {
        set: function (o) {
            l = o;
        },
        get: function () {
            showWarningAndThrow();
            return l;
        }
    };
Object.defineProperty(console, "_commandLineAPI", n);
Object.defineProperty(console, "__commandLineAPI", n);

这样,控制台自动完成将以静默方式失败,而在控制台中键入的语句将无法执行(将记录异常)。

引用: