在代码混淆算法中,我看到使用这种语法的一步:
0["constructor"]["constructor"](
0["constructor"]["constructor"](
"return \"alert()\""
)();
)();
我对javascript的了解不再帮助我......
typeof 0 => number
typeof 0["constructor"] => function
typeof 0["constructor"]["constructor"] => function
请您解释 js口译人员如何“处理”此代码? 我无法理解它的工作方式!
并且:结尾“()”是什么意思?我无法理解语法
我尝试使用firebug js console
执行
0["constructor"]["constructor"](
"return \"alert()\""
)();
控制台输出"alert()"
,(带双引号)
我认为它相当于一个评估,但事实并非如此。运行这个:
eval( "return \"alert()\"" );
只会导致SyntaxError: return not in function
。
执行此问题的第一个片段完全等同于简单地执行alert()
,因此我理解内部代码认为文本就像一个函数体并执行它,所以内部正在返回"alert()"
;外部读取最后一个字符串并认为它是一个函数体,因此执行代码,结果就是触发警报。
但是,我再说一遍。 语法是什么意思?最后对“()”有用的是什么?
0["constructor"]["constructor"](
"some code to be evaluted"
)();
答案 0 :(得分:3)
此代码正在查找Function
constructor,调用它来创建一个新函数,并将参数作为函数体的代码,然后立即调用该函数:
Function("Some code to be evaluated")()
它执行两次,一次使用String
文字"return \"alert()\""
,然后使用第一个函数中的return
值作为第二个函数的主体。
var result = Function("Some code to be evaluated")()
Function(result)()
并且Function
来自Number
,然后来自0
的{{1}}来获得Function
:
Number