我看到以下形式的代码 - 是否使用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>
答案 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