2012-12-11 102 views
0

如在該示例安全使用eval使用變量作爲對象名稱

javascript-use-variable-as-object-name

我使用的eval使用DOM屬性選擇來自陣列的元件示出。儘管用戶沒有直接改變輸入的方法,但我希望儘可能安全,並確保在我評估之前該變量確實是一個整數。

以下哪一項是最好的,最安全的方法?

$(".listitem").click(function(){ 
    var id = $(this).attr("record-id"); 
    if(!isNaN(new Number(id))){ 
     Storage.search.nearby.currec = rowsHolder[eval(id)]; 
    }else{ 
     // send email to admin, shut down 
    } 
}); 

$(".listitem").click(function(){ 
    var id = $(this).attr("record-id"); 
    if(parseInt(id)){ 
     Storage.search.nearby.currec = rowsHolder[eval(id)]; 
    }else{ 
     // send email to admin, shut down 
    } 
}); 

更多,但不是必需的信息:

基本上我一邊拉下大JSON字符串在線,含一組記錄。在使用for語句構建表格(for(i in array))時,我將每行推入一個名爲rowsHolder的數組中,並給出tr屬性record-id =「i」。然後,當用戶點擊該行時,我會調用您在上面看到的方法。我正在使用PhoneGap和JQuery Mobile。

一如往常,感謝輸入

-D

+2

爲什麼你需要評估?如果由於某種奇怪的原因需要一個字符串作爲對象鍵,請使用toString()。 – adeneo

+0

我不清楚'id'中包含什麼樣的值。它只是數字嗎?或變量名?或者像「obj.foo.bar.baz」這樣的長鏈接? – apsillers

+0

只是'rowsHolder [id]'有什麼問題? – deceze

回答

2

是絕對沒有理由在這裏使用eval

  • 如果您的id是一種數字,請使用parseFloat(id)來得到它。不必要的,因爲它在作爲屬性名稱使用時會轉換回字符串。
  • 如果你的id是一個整數,使用parseInt(id, 10)來得到它。不必要的,因爲它在作爲屬性名稱使用時會轉換回字符串。
  • 如果你的id是一個字符串,就讓它成爲一個字符串。無論如何,你使用它的屬性名稱將是一個。
+0

雖然我沒有辦法調試看到錯誤,行Storage.search.currec.record = rowsHolder [p arseInt(ID)];打破腳本,使點擊事件沒有任何反應。 Storage.search.currec.record = rowsHolder [eval(id)];雖然 – dgig

+0

我不得不使用eval的原因是,就像Bergi所說的那樣 - 腳本認爲我試圖找到並反對名爲「id」的屬性,當我實際上試圖找到一個名爲「0」或「3」的數組鍵(或對象屬性),或者包含在名爲「id」的變量中的任何內容。 – dgig

+0

如果變量'id'包含數字'0'或字符串''0''',它將起作用並返回對象'{「id」:「00088」}' – Bergi

相關問題