encode脚本和normal脚本混用的问题

简介:

  半年前第一次做脚本编码的时候由于没有什么使用经验于是在51js上询问了一下encode脚本和normal脚本混用是否有什么问题呢结果没有得到任何有建设性的意见这也至少说明了两个问题一是没有人在意二是就没有什么问题嘛。当然我更乐意于接受后一种结果就开始了encode脚本和normal脚本的混合使用。

    在这样的理解下做了很多的脚本似乎也真的没有出现过什么问题于是更加笃信自己当初的判断。结果又一次被IE暗算了encode后的脚本和normal的脚本混和使用不是没有问题也不是都有问题只是在特定的条件下会出问题真是晕死。看下面这个示例

None.gif < html >
None.gif < head >
None.gif     < title >JScript Encode Research </ title >
None.gif     < meta  name ="author"  content ="birdshome@cnblogs"   />
None.gif </ head >
None.gif < body >
ExpandedBlockStart.gif ContractedBlock.gif     < script  language ="jscript.encode"  type ="text/jscript.encode" > dot.gif
InBlock.gif        #@
~^8gAAAA==~,P~,P,Pr(L^Ycw.WDWOza+Rtn/klo~xP6E    mOkGUv#@#@&,~P,P~~,    @#@&~,P~P,~,P~,P,lVDDcB}4%+1Y 2MWYKOXa+Rtnd/moBbi@#@&,P~P,~P,8I@#@&PP~~,P~P@#@&,P~,P,PP}4NnmDR\+k/CLP',WE    mYbGU`*@#@&P~P~~,P~    @#@&P,P~~,PP~~,P~l^nMYcEr(L+1Yc\+k/CoBbI@#@&P,~P,PP,NIGjkAAA==^#~@
ExpandedBlockEnd.gif    
</ script >
ExpandedBlockStart.gif ContractedBlock.gif     < script  language ="jscript.encode"  type ="text/jscript.encode" > dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        #@
~^FgEAAA==~,P~,P,P0!x1OkKx~2mG[`#,`8@#@&@#@&~~P,P,P~2U^KNnRa.WDWOza+R\nk/Co~dot.gif{PW!x1YkKxvb@#@&P~P,P~~,    @#@&~P,PP,~~P,P,.kOndkU+vv2    mG[Rw.GDWOXancHnk/mo+E#p@#@&,P~P,P~~)i@#@&@#@&,PP,~~P,2    mGNn t+d/mL+,'~W!xmOrKxc#@#@&,P~,P,PPP@#@&~P,P~P,P~~,PMrYSk    ncBAx1W[+ \/dlTnB*i@#@&,PP~~,P~8p~,V0MAAA==^#~@
ExpandedBlockEnd.gif    
</ script >
ExpandedBlockStart.gif ContractedBlock.gif     < script  language ="jscript"  type ="text/jscript" > dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
function Normal() dot.gif{} 
InBlock.gif        Normal.prototype.Message 
= function()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            WriteLine('Normal.prototype.Message');
ExpandedSubBlockEnd.gif        }

InBlock.gif        Normal.Message 
= function()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            WriteLine('Normal.Message');
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    
</ script >
ExpandedBlockStart.gif ContractedBlock.gif     < script  language ="jscript"  type ="text/jscript" > dot.gif
InBlock.gif        
var msg = '.prototype.Message" Fail.<br>';
InBlock.gif        function WriteLine(msg) { document.write(msg + '<br><br>'); }
InBlock.gif        
InBlock.gif        var o = new Object();
InBlock.gif        try { o.Message(); }
InBlock.gif        catch(e) { WriteLine('Call 
"Object' + msg + e.message); }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
try dot.gif{ Object.Message(); }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
catch(e) dot.gif{ WriteLine('Call "Object.Message" Fail. <br>+ e.message); }
InBlock.gif      
InBlock.gif        
var e = new Encode();
ExpandedSubBlockStart.gifContractedSubBlock.gif        
try dot.gif{ e.Message(); }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
catch(e) dot.gif{ WriteLine('Call "Encode' + msg + e.message); }
InBlock.gif        Encode.Message();
InBlock.gif
InBlock.gif        var n = new Normal();
InBlock.gif        try { n.Message(); }
ExpandedSubBlockEnd.gif        catch(e) { WriteLine('Call 
"Normal' + msg + e.message); }
InBlock.gif        Normal.Message();
ExpandedBlockEnd.gif    
</ script >
None.gif </ body >
None.gif </ html >


    把上面的代码存为一个*.htm文件打开后得到结果为

  Call "Object.prototype.Message" Fail.
  Object doesn't support this property or method
  Call "Object.Message" Fail. 
  Object doesn't support this property or method
  Encode.prototype.Message
  Encode.Message
  Normal.prototype.Message
  Normal.Message

    上面那两段jscript.encode的代码很简单就是
None.gifObject.prototype.Message =  function()
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    alert('Object.prototype.Message');
ExpandedBlockEnd.gif};
None.gifObject.Message =  function()
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    alert('Object.Message');
ExpandedBlockEnd.gif}; 

ExpandedBlockStart.gif ContractedBlock.gif function Encode()  dot.gif{}
None.gifEncode.prototype.Message =  function()
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    WriteLine('Encode.prototype.Message');
ExpandedBlockEnd.gif};
None.gifEncode.Message =  function()
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    WriteLine('Encode.Message');
ExpandedBlockEnd.gif};  

    如果我们把上面两段代码替换那个html中的两段jscript.encode的代码后面的运行将不会出任何异常会得到这样的输出
  Object.prototype.Message
  Object.Message
  ...

    上面这些代码实例的试验已经详细的说明了encode脚本代码的问题。就是 不能在非编码脚本中引用编码脚本中导入到JScript内置对象上的原型(prototype)方法和静态方法。上面示例中的Object就是JScript的一个内置对象我们分别导入了一个prototpye方法和静态方法Message()。而对于非内置对象Encode我们在已编码代码中导入的prototype和static方法都可以在非编码代码中正常的访问。

    那么怎么访问内置对象的导入方法呢其实解决起来也不复杂只是比较繁琐。我们需要使用一些wrapper方法把他们和被编码的代码放在一起就可以在非编码代码中访问了比如上面的Object的导入我们可以这样包装它

None.gifObject.prototype.Message =  function()
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    WriteLine('Object.prototype.Message');
ExpandedBlockEnd.gif};
None.gifObject.Message =  function()
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    WriteLine('Object.Message');
ExpandedBlockEnd.gif};
None.gif var obj =  new Object();
None.gif
None.gif function ObjectPrototypeMessage()
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    obj.Message();
ExpandedBlockEnd.gif}
None.gif function ObjectMessage()
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    Object.Message();
ExpandedBlockEnd.gif}

    这时我们就可以通过ObjectPrototypeMessage和ObjectMessage这样的wrapper方法访问到已编码代码中内置对象的导入方法了。


本文转自博客园鸟食轩的博客原文链接http://www.cnblogs.com/birdshome/如需转载请自行联系原博主。

目录
相关文章
|
6天前
|
NoSQL Cloud Native Redis
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
阿里云瑶池数据库团队后续将持续参与Valkey社区,如过往在Redis社区一样耕耘,为开源社区作出持续贡献。
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
|
7天前
|
弹性计算 安全 API
访问控制(RAM)|云上安全使用AccessKey的最佳实践
集中管控AK/SK的生命周期,可以极大降低AK/SK管理和使用成本,同时通过加密和轮转的方式,保证AK/SK的安全使用,本次分享为您介绍产品原理,以及具体的使用步骤。
101798 1
|
8天前
|
SQL 关系型数据库 分布式数据库
Doodle Jump — 使用Flutter&Flame开发游戏真不错!
用Flutter&Flame开发游戏是一种什么体验?最近网上冲浪的时候,我偶然发现了一个国外的游戏网站,类似于国内的4399。在浏览时,我遇到了一款经典的小游戏:Doodle Jump...
112727 12
|
11天前
|
SQL 存储 JSON
Flink+Paimon+Hologres 构建实时湖仓数据分析
本文整理自阿里云高级专家喻良,在 Flink Forward Asia 2023 主会场的分享。
71304 1
Flink+Paimon+Hologres 构建实时湖仓数据分析
|
15天前
|
弹性计算 运维 安全
访问控制(RAM)|云上程序使用临时凭证的最佳实践
STS临时访问凭证是阿里云提供的一种临时访问权限管理服务,通过STS获取可以自定义时效和访问权限的临时身份凭证,减少长期访问密钥(AccessKey)泄露的风险。本文将为您介绍产品原理,以及具体的使用步骤。
151041 4
|
13天前
|
数据采集 存储 运维
提升团队工程交付能力,从“看见”工程活动和研发模式开始
本文从统一工程交付的概念模型开始,介绍了如何将应用交付的模式显式地定义出来,并通过工具平台落地。
120146 108
|
14天前
|
监控 负载均衡 Java
深入探究Java微服务架构:Spring Cloud概论
**摘要:** 本文深入探讨了Java微服务架构中的Spring Cloud,解释了微服务架构如何解决传统单体架构的局限性,如松耦合、独立部署、可伸缩性和容错性。Spring Cloud作为一个基于Spring Boot的开源框架,提供了服务注册与发现、负载均衡、断路器、配置中心、API网关等组件,简化了微服务的开发、部署和管理。文章详细介绍了Spring Cloud的核心模块,如Eureka、Ribbon、Hystrix、Config、Zuul和Sleuth,并通过一个电商微服务系统的实战案例展示了如何使用Spring Cloud构建微服务应用。
103516 9
|
15天前
|
人工智能 Serverless 对象存储
让你的文档从静态展示到一键部署可操作验证
通过函数计算的能力让阿里云的文档从静态展示升级为动态可操作验证,用户在文档中单击一键部署可快速完成代码的部署及测试。这一改变已在函数计算的活动沙龙中得到用户的认可。
121074 260
|
14天前
|
Java 数据处理 调度
更高效准确的数据库内部任务调度实践,阿里云数据库SelectDB 内核 Apache Doris 内置 Job Scheduler 的实现与应用
Apache Doris 2.1 引入了内置的 Job Scheduler,旨在解决依赖外部调度系统的问题,提供秒级精确的定时任务管理。