网站地图    收藏   

主页 > 后端 > 网站安全 >

关于eval的劫持操作 - 网站安全 - 自学php

来源:自学PHP网    时间:2015-04-17 11:59 作者: 阅读:

[导读] 前提:本文讨论在chrome浏览器下的情况,由于早期IE浏览器的实现有所不同,导致与本文所提内容存在差异。其它浏览器也未做测试。在某些需求环境中,我们需要劫持eval函数,输出所...

前提:本文讨论在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" 
www.2cto.com
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内容的需求。 
 
各位看官,有何高见。 来讨论讨论。 
 
其它要求: 劫持函数需定义于函数体外部。 定义在内部没意义。
 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论