Javascript安全问题/使用eval()

时间:2011-08-05 13:03:19

标签: javascript security eval

我看到以下形式的代码 - 是否使用eval()安全?

function genericTakeAction(frm_name,id,pagenum,action)
{
    var rset=eval("document."+frm_name);

    var x=eval("document."+frm_name+".edit_key");
    var y=eval("document."+frm_name+".cAction")
    if(x)
        x.value=id;
    if(y)
        y.value=action;

    page_list(pagenum);
}

用作:

  <a href="javaScript:;" onClick="genericTakeAction('frmSearch',
  '<?php echo $rec_id;?>','<?php echo $pagenum?>','makeOpen')" 
  class='link6'>Make Open</a>

3 个答案:

答案 0 :(得分:5)

无论是对还是错,它都是不必要的复杂。

function genericTakeAction(frm_name,id,pagenum,action)
{
    var rset = document[frm_name];

    var x = rset.edit_key;
    var y = rset.cAction;

    if(x)
        x.value=id;
    if(y)
        y.value=action;

    page_list(pagenum);
}

这是有效的,因为在JavaScript中,您可以通过以下两种方式之一访问对象的属性:使用点分语法和文字标识符,例如x = obj.foo;,或使用括号语法和字符串标识符,例如x = obj["foo"];。 (请注意foo在第一个引号中没有引号,但在第二个引号中引用;但两者都 完全 同样的事情。另请注意由于属性名称是第二种情况下的字符串,因此您可以使用任何导致字符串的表达式,因此y = "f"; x = obj[y + "oo"];也可以。{/ p>

P.S。这是错的

答案 1 :(得分:1)

eval()通常不赞成,因为您已经知道,它被认为是不安全的。

然而,在浏览器环境中,它不是一个问题,因为事实上,任何用户都可以使用Firebug等工具eval()他们想要的任何代码。

仍然存在一个问题,因为代码中嵌入的eval()可以在用户不知道他正在触发eval()的情况下运行,但它仍然不是一个问题,而是一个问题。服务器端环境,如PHP。

实际上通常使用

eval(),因为您已经证明运行从服务器端请求返回的JSON代码。较新的浏览器可以使用专用的JSON parse()函数更安全地导入JSON,但是较旧的浏览器没有此功能,因此被迫使用eval()。出于这个原因,大多数JSON库在其代码中都有eval(),但在通过eval()运行之前,通常会对输入进行一些清理。

答案 2 :(得分:1)

正如其他人已经提到的那样,即使它看起来有点复杂,但从纯安全角度来看,您必须确保genericTakeAction()函数的'frm_name'参数永远不会包含用户提供的数据。

在您的示例中,'frm_name'参数包含硬编码的文字'frmSearch'。所以只要这个genericTakeAction()函数没有被用户提供的'frm_name'参数数据调用到其他地方就可以了。

请参阅http://en.wikipedia.org/wiki/Cross-site_scripting#Traditional_versus_DOM-based_vulnerabilities