枚举方案:JScript RuntimeObject
使用JScript RuntimeObject方法枚举全局属性与枚举全局对象不同,你将使用一个正常的执行,枚举由全局RuntimeObject方法返回的一个对象。
var GLOBAL_VAR1, GLOBAL_VAR2, GLOBAL_VAR3 = 1; GLOBAL_PROP1 = 12; function GLOBAL_FUNCTION(){} if(this.RuntimeObject){ void function() { var ro = RuntimeObject(), results = [], prop; for(prop in ro) { results.push(prop); } alert("leaked:\n" + results.join("\n")); }(); }
IE中的结果
在IE8和其它较低版本中,结果包括GLOBAL_FUNCTION,GLOBAL_VAR3, GLOBAL_PROP1 (除此之外,还包括window)。 注意GLOBAL_VAR1 和GLOBAL_VAR2 并不包含其中。看来RuntimeObject并不收集未被赋值的任何变量,根据微软的文档,这不是指定的行为(以下有更多这方面的信息)。
微软的RuntimeObject文档
RuntimeObject是JScript 内置的扩展,JScript定义了七个附加的内置全局方法: ScriptEngine,ScriptEngineBuildVersion, ScriptEngineMajorVersion, ScriptEngineMinorVersion,CollectGarbage,RuntimeObject和GetObject。 这些对象都是本地JScript对象,不要与宿主对象混淆。
对于RuntimeObject,微软的JScript扩展MS-ES3EX声明如下:
RuntimeObject用来寻找一个全局变量的属性,这些带有名称的属性匹配特定的模式。这个函数只寻找全局对象中通过VariableStatement 或 FunctionDeclaration方式显式创建的属性,或是位于运算符左侧作为标识符隐式创建的属性。不能寻找通过访问全局对象显式创建的属性。
粗略的测试结果表明微软的文档是不靠谱的。
返回的对象不包括添加到变量对象之上的所有标识符,只是那些被赋值的标识符。无论它们是通过VariableDeclaration,FunctionDeclaration来创建,还是作为全局属性声明来创建都无关紧要。
查找通过FunctionBindingList创建的标识符示例
在JScriptFunction的FunctionBindingList中,所有标识符将成为包含的变量对象的属性,如:
var foo = {} (function(){ function foo.bar, baz(){} })(); ro = RuntimeObject(); alert([ro.foo.bar, "undef" in ro].join("\n"));
出处:Denis'Blog
责任编辑:bluehearts
上一页 用JScript RuntimeObject检测全局污染 [1] 下一页 用JScript RuntimeObject检测全局污染 [3]
◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。
|