对于背景,我目前正在玩Untrusted,这是一个基于JavaScript的编程游戏,其核心机制正在编辑代码以修改游戏世界以向前发展。我通过使用记录的游戏内API修改我在本地范围内给出的变量,已经解决了大多数级别的“预期”方式。但是,我想知道是否还有一些“无意识的”方法可以通过钓鱼来修改游戏状态/游戏定义。
很多游戏的代码如下(在window
范围内评估):
function foo() {
var bar = 1234;
}
我了解我可以通过引用foo
从任何范围访问window.foo
。有没有办法可以在bar
内访问foo
,即使它没有明确公开?
为了澄清,上面的代码已经为我评估了(在window
范围内,我相信,所以我至少可以获得对foo
的引用)。我无法改变评估的内容。 (我想如果我真的想要的话,我可以重新定义foo
,这会绕过很多限制,但这与当前的提问方向相关。)相反,我的目标是,鉴于已经评估过,修改它就位(例如为bar
设置一个新值。)
提前致谢!
答案 0 :(得分:4)
简短的回答是否。
无法在其范围/闭包之外访问局部变量(请注意,由于闭包,可能有多个范围可以访问单个局部变量)。
对于较长的答案,请参阅此答案,了解范围的工作原理:javascript can't access private properties。
答案 1 :(得分:0)
如果不修改foo
,则无法从bar
外部访问foo
。
但是,修改foo
:
//Original code
function foo ( ) {
var bar = 1234;
}
//Modify foo:
(function(){
var fooMatches = foo.toString().replace(/var\s+bar/g, "window.bar").match(/^\s*function\s+foo\s*\(([^()]*)\)\s*{([^\0]*)}\s*$/);
var args = fooMatches[1].split(/\s*,\s*/);
args.push( fooMatches[2] );
foo = Function.apply( window, args );
})();
//Access bar
foo();
alert( bar );