2011-08-05 74 views
3

我看到以下形式的代碼 - 是否使用eval()安全?Javascript安全問題/使用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

這可能是'eval'不必要用途列表中的#1。請參閱Gareth的回答爲什麼。 –

回答

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"];也適用。)

PS這是錯誤的

+0

但是,有必要檢查'document [frm_name]'是否實際上是一個對象/不是未定義的。否則,我會在訪問這些propertys時拋出一個類型錯誤。 – jAndy

+0

@jAndy:的確如此,但「eval」版本也是如此。 :-) –

+0

@TJCrowder:當然,但我想每個人都明白我的觀點。爲什麼在「答案」中留下錯誤? – jAndy

1

eval()一般不贊同,因爲,你已經知道,它被認爲是不安全的。

在瀏覽器環境中,但是,它是不是一個問題,因爲事實上,任何用戶可以eval()他們想使用的工具,如Firebug的任何代碼等

還有是一個問題,嵌入在代碼中的eval()可以在用戶不知道他正在觸發eval()的情況下運行,但與PHP等服務器端環境相比,它仍然不是什麼問題。

eval()實際上通常用於顯示運行從服務器端請求返回的JSON代碼。較新的瀏覽器可以使用專用的JSON parse()函數更安全地導入JSON,但較舊的瀏覽器不具備此功能,因此不得不使用eval()。由於這個原因,大多數JSON庫在其代碼中都有eval(),但通常在通過eval()運行之前會對輸入做一些處理。

1

即使它看起來有點複雜,正如其他人已經提到過的,從純粹的安全角度來看,您必須確保genericTakeAction()函數的'frm_name'參數不能包含用戶提供的數據。

在您的示例中,'frm_name'參數包含硬編碼文字'frmSearch'。所以只要這個genericTakeAction()函數沒有被其他地方的用戶提供的'frm_name'參數調用,就可以。

請參閱http://en.wikipedia.org/wiki/Cross-site_scripting#Traditional_versus_DOM-based_vulnerabilities