显然,由于最近的骗局,开发者工具被人们用来发布垃圾邮件,甚至被用来“黑客”账户。Facebook已经屏蔽了开发者工具,我甚至无法使用控制台。
他们是怎么做到的??一篇Stack Overflow的帖子声称这是不可能的,但Facebook已经证明他们错了。
只需转到Facebook并打开开发工具,在控制台中键入一个字符,就会弹出此警告。无论你投入什么,它都不会被执行。
这怎么可能?
他们甚至在控制台中阻止了自动完成:
显然,由于最近的骗局,开发者工具被人们用来发布垃圾邮件,甚至被用来“黑客”账户。Facebook已经屏蔽了开发者工具,我甚至无法使用控制台。
他们是怎么做到的??一篇Stack Overflow的帖子声称这是不可能的,但Facebook已经证明他们错了。
只需转到Facebook并打开开发工具,在控制台中键入一个字符,就会弹出此警告。无论你投入什么,它都不会被执行。
这怎么可能?
他们甚至在控制台中阻止了自动完成:
当前回答
我会这样做:
Object.defineProperty(window, 'console', {
get: function() {
},
set: function() {
}
});
其他回答
我的方法很简单,但它有助于这个主题的进一步变化。列出所有方法并将其更改为无用。
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();
})();
在Firefox中,它没有做到这一点,因为Firefox是一个开发人员浏览器,我认为由于命令WEBGL_debug_render_info在Firefox中被弃用,将被删除。请使用RENDERER和错误Referrer Policy:对于跨站点请求,将很快忽略限制较少的策略,包括“降级时没有Referrer”、“跨源时源”和“不安全url”:https://static.xx.fbcdn.net/rsrc.php/v3/yS/r/XDDAHSZfaR6.js?_nc_x=Ij3Wp8lg5Kz.
一个简单的解决方案!
setInterval(()=>console.clear(),1500);
这实际上是可能的,因为Facebook能够做到这一点。嗯,不是实际的web开发工具,而是在控制台中执行Javascript。
看看这个:Facebook如何禁用浏览器的集成开发工具?
但这真的没什么用,因为还有其他方法可以绕过这种类型的客户端安全性。
当你说它是客户端时,它发生在服务器的控制之外,所以你对此无能为力。如果你问Facebook为什么仍然这样做,这实际上不是为了安全,而是为了保护不懂javascript的普通用户,防止他们在控制台中运行代码(他们不知道如何读取)。这对于那个些承诺自动点赞服务或其他Facebook功能机器人的网站来说是很常见的,他们会在你们完成他们要求你们做的事情后,给你们一小段javascript,让你们在控制台中运行。
如果你没有Facebook那么多的用户,那么我认为没有必要做Facebook正在做的事情。
即使在控制台中禁用Javascript,也可以通过地址栏运行Javascript。
如果浏览器在地址栏禁用javascript,(当你在Google Chrome中将代码粘贴到地址栏时,它会删除短语“javascript:”)仍然可以通过inspect元素将javascript粘贴到其中一个链接中。
检查锚固件:
在href中粘贴代码:
底线是服务器端验证和安全性应该首先进行,然后再进行客户端验证。
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引发安全错误。