2012-04-26 51 views
0

我有一個完美正確的Json字符串,它通過使用eval函數在函數的方法內解析。但是,當完成時,由於某些未知原因,全局定義方法的第一行將作爲數組參數之一注入到內部。Json字符串的JavaScript eval()注入全局作用域函數

正在分析的字符串是:

{ 「ID」:1, 「名稱」: 「object1」, 「體積」:15, 「重量」:100}

解析行是:

var decoded = eval('('+ encoded +')');一旦通過使用eval()函數解碼,我已經得到了內部解碼['replaceNode']的「互補」屬性,其中包含一個包含在另一個文件中的全局作用域函數。

我認爲它是一個錯誤,但既然firefox和safari發生同樣的情況,似乎不太可能。更可能是我誤解了eval的目的。

非常感謝您的幫助。

+0

你有代碼與Object.prototype分離?這可能會使所有對象都具有附加屬性。 – goat 2012-04-26 03:54:44

+0

事實是,'eval'有一個用途:*以JS代碼*的形式運行一個字符串。不解析JSON,不解析任何東西。 **執行任意字符串**它不知道或不關心字符串代碼將執行什麼操作,如果您不執行任何操作,則會對您的站點執行一些笨拙的控制。如果你的JSON確實是正確的,你可以使用'JSON.parse'來代替。它現在嵌入到每個體面的瀏覽器中。 – cHao 2012-04-26 04:00:34

回答

4

請勿使用eval。

Eval是不安全的,可以使攻擊者執行任意代碼。改用JSON library

+0

@downvoter:解釋你自己? – orlp 2012-04-26 03:55:32

+1

也許downvoter想要這樣一個庫的例子用法? – Blender 2012-04-26 04:00:34

+0

@Blender:因此他按下了「這個答案沒用」按鈕?真的,我鏈接的圖書館可以被猴子使用,只是__read__文檔。 – orlp 2012-04-26 04:03:15

0

撇開暫時的陷阱使用eval()的...

我無法重現您所描述的副作用。

在猜測,你已經加載了一個庫,它會覆蓋eval()來「擴充」eval返回的結果。

+0

糟糕我的錯誤! 我以爲它給我展示了一個全局作用域函數,但它實際上是一個在Object原型中加載的方法... 因此,邏輯上eval生成了一個包含Object超類內所有方法的對象。 – gaspercat 2012-04-26 04:31:10

+0

實際上,github的庫似乎也會發生這種情況 – gaspercat 2012-04-26 04:35:50