encode脚本和normal脚本混用的问题与解决方法

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

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

代码如下:

<html> 
<head> 
    <title>JScript Encode Research</title> 
    <meta name="author" content="birdshome@cnblogs" /> 
</head> 
<body> 
    <script language="jscript.encode" type="text/jscript.encode"> 
        #@~^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==^#~@ 
    </script> 
    <script language="jscript.encode" type="text/jscript.encode"> 
        #@~^FgEAAA==~,P~,P,P0!x1OkKx~2mG[`#,`8@#@&@#@&~~P,P,P~2U^KNnRa.WDWOza+R\nk/Co~{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==^#~@ 
    </script> 
    <script language="jscript" type="text/jscript"> 
        function Normal() {}  
        Normal.prototype.Message = function() 
        { 
            WriteLine('Normal.prototype.Message'); 
        };  
        Normal.Message = function() 
        { 
            WriteLine('Normal.Message'); 
        };  
    </script> 
    <script language="jscript" type="text/jscript"> 
        var msg = '.prototype.Message" Fail.<br>'; 
        function WriteLine(msg) { document.write(msg + '<br><br>'); }

var o = new Object(); 
        try { o.Message(); } 
        catch(e) { WriteLine('Call "Object' + msg + e.message); } 
        try { Object.Message(); } 
        catch(e) { WriteLine('Call "Object.Message" Fail. <br>' + e.message); }

var e = new Encode(); 
        try { e.Message(); } 
        catch(e) { WriteLine('Call "Encode' + msg + e.message); } 
        Encode.Message();

var n = new Normal(); 
        try { n.Message(); } 
        catch(e) { WriteLine('Call "Normal' + msg + e.message); } 
        Normal.Message(); 
    </script> 
</body> 
</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的代码很简单,就是: Object.prototype.Message = function()
{
    alert('Object.prototype.Message');
};
Object.Message = function()
{
    alert('Object.Message');
}; 
function Encode() {}
Encode.prototype.Message = function()
{
    WriteLine('Encode.prototype.Message');
};
Encode.Message = function()
{
    WriteLine('Encode.Message');
};  
    如果我们把上面两段代码替换那个html中的两段jscript.encode的代码,后面的运行将不会出任何异常,会得到这样的输出:   Object.prototype.Message
  Object.Message
  ...
    上面这些代码实例的试验,已经详细的说明了encode脚本代码的问题。就是,不能在非编码脚本中,引用编码脚本中导入到JScript内置对象上的原型(prototype)方法和静态方法。上面示例中的Object就是JScript的一个内置对象,我们分别导入了一个prototpye方法和静态方法Message()。而对于非内置对象Encode,我们在已编码代码中导入的prototype和static方法,都可以在非编码代码中正常的访问。

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

Object.prototype.Message = function()
{
    WriteLine('Object.prototype.Message');
};
Object.Message = function()
{
    WriteLine('Object.Message');
};
var obj = new Object();

function ObjectPrototypeMessage()
{
    obj.Message();
}
function ObjectMessage()
{
    Object.Message();
}
    这时,我们就可以通过ObjectPrototypeMessage和ObjectMessage这样的wrapper方法访问到已编码代码中内置对象的导入方法了。

(0)

相关推荐

  • escape、encodeURI 和 encodeURIComponent 的区别

    escape() 方法 MSDN JScript Reference中如是说: The escape method returns a string value (in Unicode format) that contains the contents of [the argument]. All spaces, punctuation, accented characters, and any other non-ASCII characters are replaced with %xx

  • javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)

    方法一: 用的浏览器内部转换器实现转换,方法是动态创建一个容器标签元素,如DIV,将要转换的字符串设置为这个元素的innerText(ie支持)||textContent(火狐支持),然后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串,显示的时候反过来就可以了(实际上显示的时候不用通过转换,直接赋值在div就可以正常显示的). 复制代码 代码如下: <script type="text/javascript"> function HTMLEncode(

  • js中encode、decode的应用说明

    encodeURIComponent 将文本字符串编码为一个统一资源标识符 (URI) 的一个有效组件. encodeURIComponent(encodedURIString) 必选的encodedURIString参数代表一个已编码的 URI 组件. 说明 encodeURIComponent方法返回一个已编码的 URI.如果您将编码结果传递给decodeURIComponent,那么将返回初始的字符串.因为encodeURIComponent方法对所有的字符编码,请注意,如果该字符串代表一

  • javascript 字符 Escape,encodeURI,encodeURIComponent

    escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码.所有的空格符.标点符号.特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字).比如,空格符对应的编码是%20. 不会被此方法编码的字符: @ * / + encodeURI() 方法: 把URI字符串采用UTF-8编码格式转化成escape格式的字符串. 不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + ' encodeURIC

  • js将网址转为urlencode类型

    调用方法,将下面函数写在一个js文件,支持调用 将要encode 的网址改 function UrlEncode(str) { return transform(str); } function transform(s) { var hex='' var i,j,t j=0 for (i=0; i 65535) { return ("err!") } first = Math.round(num/4096 - .5); temp1 = num - first * 4096; secon

  • JavaScript.Encode手动解码技巧

    JS.Encode是在JS代码进行编码之后形成的"乱码",此乱码除无法阅读之外,仍能够良好的执行. 往往在网页上有JS加密代码的解码方法,但是由于代码中存在转义字符,无法正确的进行解码. JAVAScript使用以下八种转义字符.这些字符都是以一个反斜线(\)开始.当JAVAScript的解释器(Interpreter)看到反斜线时,就会特别注意,表现出程序员所要表达的意思. 序 转义字符 使用说明 1 \b 后退一格(Backspace) 2 \f 换页(Form Feed) 3 \

  • 关于JAVASCRIPT urldecode URL解码的问题

    这个时候,出现了encodeURIComponent.decodeURIComponent,它可以完全的对URL进行编码解码,但是遇到例如搜索引擎用到的部分转码,又摸不到门了,没问题,PHP官方出了一个解决方案: 复制代码 代码如下: decodeURIComponent((str + '').replace(/\+/g, '%20')); 他可以完美的对搜索引擎的地址进行解码,因为搜索引擎只习惯对"空格"进行转码.忘了说还习惯对中文进行转码... 那以上所有的方案遇到中文就崩溃了,是

  • Javascript下的urlencode编码解码方法附decodeURIComponent

    关于在ASP(Server.UrlEncode).PHP(urlencode())函数编码结果,或是经过asp.php等动态语言直接写入COOKIES的中文字符,用JS读取的时候,都会碰到一个编码的问题,那就是最终字符串被urlencode编码了,而又时有需要从JS在客户端去读取这些数据. 而本文,就大概说说如何在js中通过系统自带的函数去解决这个问题. 而相信碰到过此问题的朋友应该都有所了解,目前网络上流行一些js下的自定义函数去解决这个问题,如说vbscript(URLDecode()).j

  • javascript htmlencode函数(ff兼容版) 主要是编辑器中反转html代码

    方法一: 用的浏览器内部转换器实现转换,要领是动态创建一个容器标签元素,如DIV,将要转换的字符串设置为这个元素的innerText(ie支持)||textContent(火狐支持),然后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串,显示的时候反过来就可以了(实际上显示的时候不消通过转换,直接赋值在div就可以正常显示的). function HTMLEncode(html) { var temp = document.createElement ("div")

  • 用JavaScript实现UrlEncode和UrlDecode的脚本代码

    复制代码 代码如下: <script type="text/vbscript">     Function str2asc(strstr)       str2asc = hex(asc(strstr))      End Function      Function asc2str(ascasc)       asc2str = chr(ascasc)      End Function     </script> 将vbscript函数转成javascrip

  • Javascript UrlDecode函数代码

    有时候可能会有这么一个需求,我在后台使用: 复制代码 代码如下: HttpUtility.UrlEncode(str, System.Text.Encoding.UTF8); 将Url进行编码,前台JS需要使用这段内容,这时候就需要解码了: 代码 复制代码 代码如下: /** * Url编码 **/ ShengUtils.encode = function(unzipStr){ var zipstr=""; var strSpecial="!\"#$%&'(

  • js编码之encodeURIComponent使用介绍(asp,php)

    因为要新作系统,因此对于JS脚本又重新研究了一下.在对新的URL编码的时候发现,网页编码的格式对于JS的影响很大,在这里书写一点. {var B=siteUrl+this.actionUrl+(this.type==="all"?"":this.type)+"&SearchWord="+encodeURIComponent(A).replace(/'/g,"%27");$redirect(B)}} 在制作的时候,发现传

  • javascript encodeURI和encodeURIComponent的比较

    背景 encodeURI 和 encodeURIComponent都是ECMA-262标准中定义的函数,所有兼容这个标准的语言(如JavaScript, ActionScript)都会实现这两个函数.它们都是用来对URI (RFC-2396)字符串进行编码的全局函数,但是它们的处理方式和使用场景有所不同.为了解释它们的不同,我们首先需要理解RFC-2396中对于URI中的字符分类 保留字符(reserved characters):这类字符是URI中的保留关键字符,它们用于分割URI中的各个部分

随机推荐