如果您将}!{
放入Chrome中的JavaScript控制台,那么您将获得false
。
为什么我们没有收到错误?
答案 0 :(得分:14)
出现这种行为的原因是,Chrome会使用另一段代码将您输入的任何内容包装到控制台中。
它包装的代码(在撰写本文时)如下:
with ((window && window.console && window.console._commandLineAPI) || {}) {
// Your code here.
}
输入}!{
将关闭代码块括号,并在最后创建一个新的(否定的)对象。
正如您在控制台中看到的那样!{}
会返回false
。
我经历了相当漫长的调查过程以找到答案,我的原始评论保留在下面
原始答案:
只是一个理论;我想在控制台中输入的代码在函数
中被调用 function execUserCode() { code }
您正在做的是创建
function execUserCode() { }!{ }
控制台正在返回最后一个结果,实际上是!{ }
= false
修改强>
很多关于这可能是错误的评论。我同意。这只是一个理论。
我喜欢这些谜题,所以我对Chromium来源进行了深入研究,这对我来说有点多,但我会留下一些指示,以防其他人有刺伤。
JS控制台被称为“检查员”,可在此处找到:
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) || {}) {
}!{
}
我很亲密,但现在我们得到了答案:)
代码在当前第440行的chromium/src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js
中生成。
答案 1 :(得分:3)
只是一个猜测。如果脚本包含在{}
中并使用eval
执行,则会发生这种情况。
用户脚本:"}!{"
附在{}
:"{}!{}"
然后eval("{}!{}")
提供false
所以我猜这就是浏览器控制台中发生的事情。