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

在埃瓦尔的论证中逃逸

  •  5
  • Kirzilla  · 技术社区  · 14 年前

    我在用 eval 指定动态对象的属性。

    property_name_1 = property1;
    property_name_2 = property2;
    property_value_1 = 1;
    property_value_2 = 2;
    var obj = new Object;
    
    eval("obj."+property_name_1+"='"+property_value_1+"'");
    eval("obj."+property_name_2+"='"+property_value_2+"'");
    

    然后我在Ajax请求期间使用这个对象作为post数据。

    一切正常,但众所周知,Eval不安全,我应该逃跑。 property_value_1 , property_value_2 . 例如, property_value_2 = "<a href=''>Yahoo!</a>" 会导致错误。

    最好的方法是什么?

    谢谢你

    4 回复  |  直到 14 年前
        1
  •  6
  •   Guffa    14 年前

    最好的办法是不使用 eval 完全:

    obj[property_name_1] = property_value_1;
    obj[property_name_2] = property_value_2;
    

    如果仍要这样做,则必须转义撇号和反斜杠,以便将值放入字符串文本中:

    eval("obj." + property_name_1 + "='" + property_value_1.replace(/\\/g,'\\\\').replace(/'/g,"\\'") + "'");
    eval("obj." + property_name_2 + "='" + property_value_2.replace(/\\/g,'\\\\').replace(/'/g,"\\'") + "'");
    

    (如果用引号而不是撇号包围文字字符串,则必须转义引号和反斜杠。)

        2
  •  0
  •   mhitza Federico Taschin    14 年前

    eval 真的需要吗?

    基于您的示例,您可以简单地执行以下操作:

    obj[property_name_1] = property_value_1;
    obj[property_name_2] = property_value_2;
    

    如果这不是一个解决方案,无论出于什么原因,继续使用 \ .

        3
  •  0
  •   ArtBIT    14 年前

    尝试:

    var obj = new Object();
    obj[property_name] = property_value;
    
        4
  •  -1
  •   Kalinin    14 年前

    我将使用对象文本:

    var obj = {
        property_name_1: property_value_1, 
        property_name_2: property_value_2
    };