javascript - Facebook如何禁用浏览器的集成Developer Tools?

  显示原文与译文双语对照的内容

所以很明显,由于最近的诈骗,开发者工具被人们用来发布垃圾邮件甚至用于"hack"账户。 Facebook已经阻止了开发者工具,我甚至不能使用控制台。

Enter image description here

他们是怎么做到的? 一个栈溢出post声称它不可能,但是Facebook已经证明他们错了。

只要进入Facebook并打开开发者工具,在控制台输入一个字符,这个警告就会弹出。 无论你投入什么,它都不会被执行。

这怎么可能?

他们甚至阻止了控制台中的auto-complete:

Enter image description here

时间: 原作者:

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

仅仅是明确的:试图阻止黑客client-side是一个坏主意一般来说;这是要对抗一个特定社会工程攻击

如果你在测试组中结束,并对此感到恼怒,抱歉。 至少某些 victims,的我尝试着将 opt-out的页面尽可能地简单,同时仍在可怕到足以止点

实际代码非常类似于 @joeldixon66's 链接 ;我们的代码稍微复杂一点。

Chrome 包装所有的控制台代码


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

。所以站点重新定义了 console._commandLineAPI 以引发:


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

这是没有足够的( 试试吧),但这是主要的技巧。


结论:Chrome 团队决定从 user-side JS打败控制台是一个 Bug 和解决了问题,这使得这个技术无效。 之后,额外的保护被添加到保护用户免受 self-xss

原作者:

它在 Chrome 中的作用很好- 但是Facebook似乎试图禁用JavaScript控制台来防止最近的欺骗。

幸运的是,他们提供了关闭这个保护的选项- https://www.facebook.com/selfxss

在每个我的评论- 需要像 console,编辑:作为这里处可能会阻止 JavaScript execution.

原作者:

我无法让它在任何页面上触发。 一个更健壮的版本可以做到:


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

console.log('test');

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

编辑 Thinking @joeldixon66的想法是正确的: KSpace:::

原作者:

我使用 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);

这样,控制台auto-complete就会失败,而在控制台中键入的语句将无法执行( 将记录该异常) 。

参考:

原作者:

除了重新定义 console._commandLineAPI 之外,还有一些其他方法可以在 web kit浏览器上中断 InjectedScriptHost,以防止或者改变在开发人员控制台中输入的表达式的求值。

其中之一是连接到 Function.prototype.call

InjectedScriptHost 为 Chrome call 特么它的eval函数用于计算输入的表达式

var result = evalFunction.call(object, expression);

对于这种,可以侦听该的正在 evaluatecallthisArg 如果调用参考第一个参数( InjectedScriptHost )


if (window.webkitURL) {
 var ish, _call = Function.prototype.call;
 Function.prototype.call = function () {//Could be wrapped in a setter for _commandLineAPI, to redefine only when the user started typing.
 if (arguments.length> 0 && this.name ==="evaluate" && arguments [0].constructor.name ==="InjectedScriptHost") {//If thisArg is the evaluate function and the arg0 is the ISH
 ish = arguments[0];
 ish.evaluate = function (e) {//Redefine the evaluation behaviour
 throw new Error ('Rejected evaluation of: n'' + e.split ('n').slice(1,-1).join ("n") + ''');
 };
 Function.prototype.call = _call;//Reset the Function.prototype.call
 return _call.apply(this, arguments); 
 }
 };
}

你可以 比如 抛出一个错误,即评估被拒绝。

enter image description here

下面是一个示例有效的输入的表达式获取传递给一个在 evaluate CoffeScript编译器在把列表传给函数。

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$$) {
 }
})();

他们只是覆盖 console._commandLineAPI 来抛出安全错误。

原作者:
...