javascript:(function() {var ro=RuntimeObject(),r=[],i=0,p;for(p in ro){r[i++]=p;}alert('leaked:n'+r.join('n'));})();JScript语法扩展 在较早的“查找由FunctionBindingList创建的标识符”的例子中提到过JScript扩展--JScriptFunction。这个名字不是一个破绽,它是JScript语言的扩展,JScriptFunction 如下:
JScriptFunction : function FunctionBindingList ( FormalParameterListopt ) { FunctionBody }
RuntimeObject(filterString): The filterString Parameter
RuntimeObject方法接受一个可选的过滤字符去匹配标识符。遗憾的是,filterString 不能转换成正则表达式,而是用可选的leftWild和rightWild来进行子匹配默认为“*”。
这意味着filterString = “a*” 将匹配标识符a和a1,而不是ba 。
结论
抛开文档的bug和缺点来说,RuntimeObject 提供了一个有用的替代方案来解决JScript中枚举全局属性的问题。RuntimeObject的优点在于它仅包括用户定义的属性,全局的window属性除外。
前面提到的书签提供了一个简便的方法去查看一个页面中不经意间创建的全局属性(它也表明这个站点也不是全局对象保持清洁的光辉典范)。
RuntimeObject的其它应用
跨浏览器标识泄露书签
相对于IE中标识泄露检测,写一个跨浏览器标识泄露检测是下一个逻辑步骤。
自动标识符泄露检测
意外的全局标识符检测应该是自动匹配的。
YUI Test 的单元测试框架为TEST_CASE_BEGIN_EVENT 和TEST_CASE_COMPLETE_EVENT 提供了钩子。这些事件用来检测RuntimeObject,并在程序代码运行期间捕捉泄露的标识符。
在TEST_CASE_BEGIN_EVENT 中检测RuntimeObject 并存储结果。在TEST_CASE_COMPLETE_EVENT 中再次检测RuntimeObject 并与TEST_CASE_BEGIN_EVENT中存储的结果比较。接下来,对于每一个出现在TEST_CASE_COMPLETE_EVENT中而并没有出现在TEST_CASE_BEGIN_EVENT中的每属性,一个全局标识符已被泄露,一个测试案例的警告就会记录下来。
参考
[MS-ES3EX]: Microsoft JScript Extensions to the ECMAScript Language Specification Third Edition. 原文地址:http://dhtmlkitchen.com/?category=/Browsers/&date=2010/04/11/&entry=Detecting-Global-Pollution-with-the-JScript-RuntimeObject
转载地址:http://www.denisdeng.com/?p=1043 (编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|