代码之家  ›  专栏  ›  技术社区  ›  Gad

Eval是邪恶的…那么我应该用什么来代替呢?

  •  19
  • Gad  · 技术社区  · 15 年前

    这就是问题所在。无论我多么努力地清理输入,我还是不想使用eval()函数。我已经检查过谷歌使用“AJAX中的JSON而不使用eval”的方法,并且已经运行了一系列不同的方法。。。

    9 回复  |  直到 15 年前
        1
  •  22
  •   cobbal    15 年前

    javascript library

    简单用法:

    JSON.parse('[{"some":"json"}]');
    JSON.stringify([{some:'json'}]);
    

    编辑 :正如注释中指出的,如果您查看其源代码,则会使用eval(尽管它看起来是先经过消毒的)

    要完全避免它,请查看 json_parse json-sans-eval

        2
  •  11
  •   bobince    15 年前

    是否有一种标准的、经验证的安全方法来执行此操作?

    在即将发布的ECMAScript 3.1版本的JavaScript中,有一种建议的标准方法: JSON.parse

    如果攻击者能够将恶意JavaScript注入到您通过JSON吐出的内容中,那么您将面临比eval更大的问题。

        3
  •  9
  •   user19302 user19302    15 年前

    我想说,一旦输入被消毒,评估是最好的方法。如果您的服务器遭到破坏,人们无论如何都可以向客户端发送他们想要的任何脚本。因此,进行评估并不是一个大的安全风险。如果您担心人们在到达客户端之前操纵数据包,那么脚本本身也可以修改。

    :)

        4
  •  2
  •   Dónal    15 年前
        6
  •  0
  •   Walden Leverich    15 年前

    这取决于你们想用卫生设施做些什么。我已经取得了巨大的成功 prototype 框架对JSON和安全评估的支持。

        7
  •  0
  •   Kenan Banks    15 年前

    如果你确定没有注射风险,而且你不是 eval()ing 在循环中,然后使用 eval()

        8
  •  0
  •   Andreas    14 年前

    从jQuery中“窃取”

    // Try to use the native JSON parser first
    return window.JSON && window.JSON.parse ?
        window.JSON.parse( data ) :
        (new Function("return " + data))();
    
        9
  •  0
  •   Lorenz Lo Sauer    12 年前

    eval.call(document, "console.log(this)")
    eval.call(navigator, "console.log(this)")
    eval.call(window, "console.log(this)")
    (function(){eval.call(document, "console.log(this)")})()
    >Window
    

    脚本:

    假设您在各种文档元素(如属性)的标记代码中使用单个属性 可见的

    <img src="" onvisible="src='http://www.example.com/myimg.png';">
    

    Function === 0..constructor.constructor
    >true
    
    Function('return [this, arguments]').call(window, 1,2,3)
    >Window, Arguments[3]]
    Function('return [this, arguments]').call(document, 1,2,3)
    >Document, Arguments[3]]
    Function('return [this, arguments]').call(navigator, 1,2,3)
    >Navigator, Arguments[3]]    
    

    总而言之:

    var eventQueue = [];
    var els = document.querySelectorAll('[onvisible]');
    
    for (var el in els) {
        var jscode = els[el].getAttribute('onvisible');
        eventQueue.push( {el:els[el], cb:Function(jscode)} )
    }
    
    //eventQueue[0].cb.call(scope, args);