显然,由于最近的骗局,开发者工具被人们用来发布垃圾邮件,甚至被用来“黑客”账户。Facebook已经屏蔽了开发者工具,我甚至无法使用控制台。
他们是怎么做到的??一篇Stack Overflow的帖子声称这是不可能的,但Facebook已经证明他们错了。
只需转到Facebook并打开开发工具,在控制台中键入一个字符,就会弹出此警告。无论你投入什么,它都不会被执行。
这怎么可能?
他们甚至在控制台中阻止了自动完成:
显然,由于最近的骗局,开发者工具被人们用来发布垃圾邮件,甚至被用来“黑客”账户。Facebook已经屏蔽了开发者工具,我甚至无法使用控制台。
他们是怎么做到的??一篇Stack Overflow的帖子声称这是不可能的,但Facebook已经证明他们错了。
只需转到Facebook并打开开发工具,在控制台中键入一个字符,就会弹出此警告。无论你投入什么,它都不会被执行。
这怎么可能?
他们甚至在控制台中阻止了自动完成:
当前回答
我有一个简单的方法:window.console=函数(){}
其他回答
我无法在任何页面上触发它。更强大的版本可以做到这一点:
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功能(用于格式化输出的提示)
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引发安全错误。
这实际上是可能的,因为Facebook能够做到这一点。嗯,不是实际的web开发工具,而是在控制台中执行Javascript。
看看这个:Facebook如何禁用浏览器的集成开发工具?
但这真的没什么用,因为还有其他方法可以绕过这种类型的客户端安全性。
当你说它是客户端时,它发生在服务器的控制之外,所以你对此无能为力。如果你问Facebook为什么仍然这样做,这实际上不是为了安全,而是为了保护不懂javascript的普通用户,防止他们在控制台中运行代码(他们不知道如何读取)。这对于那个些承诺自动点赞服务或其他Facebook功能机器人的网站来说是很常见的,他们会在你们完成他们要求你们做的事情后,给你们一小段javascript,让你们在控制台中运行。
如果你没有Facebook那么多的用户,那么我认为没有必要做Facebook正在做的事情。
即使在控制台中禁用Javascript,也可以通过地址栏运行Javascript。
如果浏览器在地址栏禁用javascript,(当你在Google Chrome中将代码粘贴到地址栏时,它会删除短语“javascript:”)仍然可以通过inspect元素将javascript粘贴到其中一个链接中。
检查锚固件:
在href中粘贴代码:
底线是服务器端验证和安全性应该首先进行,然后再进行客户端验证。