当前位置:首页 >> 网络通讯 >> 网络安全 >> 内容

关于eval的劫持操作

时间:2013/4/19 12:10:00 作者:平凡之路 来源:xuhantao.com 浏览:

前提:本文讨论在chrome浏览器下的情况,由于早期IE浏览器的实现有所不同,导致与本文所提内容存在差异。其它浏览器也未做测试。 

 

在某些需求环境中,我们需要劫持eval函数,输出所eval的内容。对于常规的场景来说,这一点是非常容易实现的。 搜狗电脑知识网

 

var eval=(function(e){ 

    return function(data){ 

    console.log(data); 

    e(data); 

    } 

})(eval); 

 

eval("alert(1)");  //我们可以在控制台看到输出 alert(1)

但是在某些特定情况下,上述的代码,就会出现问题,最为典型的,就是eval发生在函数局部,且eval的内容中,含有局部变量时。 

 

我们对比以下代码。 

 

未劫持情况下,弹出 "local" 

var a="global"; 

function myfunc(){ 

  var a="local"; 

  eval("alert(a)"); 

myfunc();

加入劫持代码后,弹出"global" 

 

var eval=(function(e){ 

    return function(data){ 

    console.log(data); 

    e(data); 

    } 

})(eval); 

 

var a="global"; 

function myfunc(){ 

  var a="local"; 

  eval("alert(a)"); 

myfunc();

也就是说,我们的劫持,改变了原本代码应有的逻辑,这样显然是不完美的。 

 

查阅了相关资料,eval 有 “直接调用”与“间接调用”的区别。 只有直接调用的eval才能够区分所eval内容里的变量是“全局”或“局部”,而间接调用,则都是当作全局变量来对待。 

 

而目前并没有一个很有效的办法,在劫持eval函数的同时,保证这个eval是一个“直接调用”。因为哪怕是下面的代码操作,都会导致eval变为一个“间接调用”。 

 

window.eval("xxxx"); //间接调用 

 

var eval2=eval; 

eval2("xxxx");  //间接调用 

 

eval.call(this, '...')  //间接调用 

 

(1, eval)('...') //间接调用

有些方法则属于是直接调用: 

 

eval('...')

(eval)('...')

(((eval)))('...')

(function() { return eval('...') })()

eval('eval("...")')

(function(eval) { return eval('...'); })(eval)

with({ eval: eval }) eval('...')

with(window) eval('...')

但是属于直接调用的任何形式,都无法满足我们劫持eval内容的需求。 

 

各位看官,有何高见。 来讨论讨论。 

 

其它要求: 劫持函数需定义于函数体外部。 定义在内部没意义。

 

相关文章
  • 没有相关文章
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1