本文介绍了Facebook和Netflix为防范恶意用户通过控制台发送垃圾信息而禁用JavaScript控制台的方法。通过劫持window.console对象,利用Object.defineProperty拦截get和set操作,当检测到_commandLineAPI时抛出异常,从而阻止命令执行。
背景与动机
包括Facebook和Netflix在内的几家大型科技公司,决定禁止用户在控制台(console)中执行JavaScript命令。
这一举措最初由Facebook发起,旨在防止恶意用户利用JavaScript控制台执行特定命令,从而向所有Facebook用户发送大量垃圾信息。
尽管这一做法招致了许多批评,但在该措施实施前,他们使用的代码如下所示。
核心实现代码
具体实现代码如下。
看起来Netflix似乎是追随Facebook的做法 [https://news.ycombinator.com/item?id=7222129]。
(function() {
try {
var $_console$$ = console;
Object.defineProperty(window, "console", {
get: function() {
if ($_console$$._commandLineAPI)
throw "抱歉, 为了用户安全, 本网站已禁用console脚本功能";
return $_console$$
},
set: function($val$$) {
$_console$$ = $val$$
}
})
} catch ($ignore$$) {
}
})(); 效果与评价
虽然个人意见微不足道,但从实际角度看,这种做法是合法的。从他们的立场来看,如果暂时禁用控制台有助于防止问题发生,那么这是必要的措施。
然而从长远来看,这并非一个理想的方案;其目标可能仅仅是屏蔽那些依赖控制台的用户。
无论如何,如果你希望防止控制台执行脚本,这段代码看起来效果不错,且确实有效。