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

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

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

这怎么可能?

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


当前回答

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:::

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

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

如果你最终参加了测试组,并对此感到恼火,对不起。我试图使旧的选择退出页面(现在的帮助页面)尽可能简单,同时仍然足够吓人,至少可以阻止一些受害者。

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

Chrome将所有控制台代码封装在

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

…所以网站重新定义了控制台_要抛出的commandLineAPI:

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

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


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

我使用Chrome开发工具找到了Facebook的控制台脚本。以下是为提高可读性所做的小改动。我删除了我无法理解的部分:

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);

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

参考文献:

对象定义属性对象.getOwnPropertyDescriptorChrome的console.log功能(用于格式化输出的提示)

我的方法很简单,但它有助于这个主题的进一步变化。列出所有方法并将其更改为无用。

  Object.getOwnPropertyNames(console).filter(function(property) {
     return typeof console[property] == 'function';
  }).forEach(function (verb) {
     console[verb] =function(){return 'Sorry, for security reasons...';};
  });

然而,更好的方法是禁止以任何有意义的方式打开开发人员工具

(function() {
    'use strict';
    Object.getOwnPropertyNames(console).filter(function(property) {
        return typeof console[property] == 'function';
    }).forEach(function (verb) {
        console[verb] =function(){return 'Sorry, for security reasons...';};
    });
    window.addEventListener('devtools-opened', ()=>{
        // do some extra code if needed or ...
        // maybe even delete the page, I still like to add redirect just in case
        window.location.href+="#";
        window.document.head.innerHTML="";
        window.document.body.innerHTML="devtools, page is now cleared";
    });
    window.addEventListener('devtools-closed', ()=>{
        // do some extra code if needed
    });
    let verifyConsole = () => {
        var before = new Date().getTime();
        debugger;
        var after = new Date().getTime();
        if (after - before > 100) { // user had to resume the script manually via opened dev tools 
            window.dispatchEvent(new Event('devtools-opened'));
        }else{
            window.dispatchEvent(new Event('devtools-closed'));
        }
        setTimeout(verifyConsole, 100);
    }
    verifyConsole();        
})();

一个简单的解决方案!

setInterval(()=>console.clear(),1500);