如果你在Chrome的JavaScript控制台中输入}!{
,你将得到false
作为结果。
为什么我们没有收到错误提示?
如果你在Chrome的JavaScript控制台中输入}!{
,你将得到false
作为结果。
为什么我们没有收到错误提示?
这种行为的原因是因为Chrome会将您输入控制台的任何内容包装在另一段代码中。
它所包装的代码(截至撰写本文时)如下:
with ((window && window.console && window.console._commandLineAPI) || {}) {
// Your code here.
}
}!{
会关闭代码块大括号,并在末尾创建一个新的(否定的)对象。!{}
返回了 false
。
function execUserCode() { code }
你正在创建
function execUserCode() { }!{ }
控制台返回最后的结果,实际上是 !{ }
= false
chromium/src/third_party/WebKit/Source/WebCore/inspector/
我一直在查看 inspector/front-end/ConsoleView.js
,我认为我找到了用户代码执行的一部分。evaluateUsingTextPrompt: function(expression, showResultOnly)
{
this._appendCommand(expression, this.prompt.text, false, showResultOnly);
},
小小的灵感。我在控制台中完成了这个操作。
> myEval = eval
> eval = function(str) { console.log(str); myEval(str) }
> }!{
结果:
with ((window && window.console && window.console._commandLineAPI) || {}) {
}!{
}
我差点就成功了,但现在我们有答案啦 :)
代码是在chromium/src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js
中生成的,目前大约在第440行。
return 'test';
会创建语法错误。而且我不认为他们会使用字符串拼接来构建函数,他们会使用Function
构造函数。 - Felix Kling}("test");{
应该返回 undefined
,因为最后的表达式只是 {}
。 - kapexconsole.log(arguments)
会引发ReferenceError。也许像你说的那样,但它只是一个简单的块而不是函数。 - gray state is coming仅仅是猜测。如果脚本被括在 {}
中并使用 eval
执行,这种情况就会出现。
用户脚本: "}!{"
被括在 {}
中: "{}!{}"
然后 eval("{}!{}")
就会返回 false
所以我猜这就是在浏览器控制台中发生的事情。
测试
,这将支持你的猜测! - Amberlamps
}!!{
返回true
,而};{
返回undefined
。 - funkybro}!{
、}!!{
和};{
显示“语法错误”。 - rosscj2533