2010-03-23 83 views
7

問題:我正在使用eval從我的WebMethods之一解析JSON返回值。

我不想添加jquery-json,因爲傳輸量已經很大。 所以我用eval解析JSON返回值。
現在有傳言說這是不安全的。爲什麼?

沒有人可以修改JSOn的返回值,除非他們破解我的服務器,在這種情況下,我會有一個更大的問題。

如果他們在本地執行此操作,那麼JavaScript只會在瀏覽器中執行。
所以我沒有看到問題出在哪裏。

有沒有人可以通過這個具體的例子揭示這一點?使用JavaScript eval解析JSON

function OnWebMethodSucceeded(JSONstrWebMethodReturnValue) 
{ 
    var result=eval('(' + JSONstrWebMethodReturnValue + ')') 
    ... // Adding result.xy to a table 
} 

回答

14

的根本問題是eval可以運行任何JavaScript,而不僅僅是反序列化JSON格式的數據。使用它來處理來自不可信或半可信來源的JSON時,存在風險。將JSON包裝在括號中的頻繁訣竅不足以確保任意JavaScript不被執行。考慮這個「JSON」,這真的不是:

function(){alert('Hi')})(

如果你有這樣的一個變量x和這樣做:

var result = eval("(" + x + ")"); 

...你會看到一個警告 - JavaScript的跑了。安全問題。

如果您的數據來自可信來源(聽起來像是這樣),我不會擔心它太多。也就是說,你可能會對Crockford的討論感興趣here(Crockford是JSON的發明者和一般知識淵博的JavaScript人)。 Crockford還在this page上提供了至少三個公有領域的解析器,您可能會考慮使用:他的json2.js解析器和字符串,縮小時只有2.5k大小,但仍然使用eval(它首先需要多個預防措施);他的json_parse.js,這是一個遞歸下降解析器不使用eval;和他的json_parse_state.js,一個狀態機解析器(不再使用eval)。所以你可以選擇你的毒藥。 (喊出來Camilo Martin您指出那些過去兩年的替代品。)

+4

應該注意的是,Crockford的JSON包含兩個其他庫(除了主json.js和json2.js)以及不使用'eval'的不同解析模式。他們是'json_parse.js'和'json_parse_state.js',可以在這裏找到(https://github.com/douglascrockford/JSON-js/) – 2010-12-08 06:48:43

+0

@Camilo:非常好,謝謝! – 2010-12-08 10:02:32

+0

可以說,我沒有來自外部來源的輸入,我可以安全地使用eval嗎? – 2013-02-08 19:57:22

4

越來越多的JSON解析和編碼可用本機在現代瀏覽器,[wikipedia reference]這使你的應用程序安全的JSON功能,無需加載額外的庫。

你可以做這樣的事情測試原生JSON支持:通過framewok可用

var native_JSON_exists = typeof window.JSON === 'object'; 

您應該加載像道格拉斯Crockford的一個JSON解析庫(由TJ克羅德鏈接,以上)或功能對於沒有本地支持的瀏覽器。 (但您至少應該在支持它的瀏覽器中使用本機JSON,以保護足夠幸運擁有現代瀏覽器的用戶)

請記住,JSON是JavaScript語法的一個子集,因此可用於JavaScript eval語句的字符串可能不適用於正確的JSON解析。您可以使用JSLint測試您的JSON字符串的錯誤(http://www.jslint.com/)。

+1

+1不幸的是,本地支持還沒有真正準備好黃金時間, (令人驚訝的)太多的執行錯誤。但它會到達那裏。 – 2010-03-23 16:43:35

+0

@ T.J。克勞德什麼錯誤? – 2010-12-08 04:29:01

+0

@Camilo:這裏有[this one](http://stackoverflow.com/questions/1288962/ie8-native-json-parse-bug-causes-stack-overflow)。我確定我聽說過Prototype和jQuery庫中有關其他人(而不僅僅是IE)的評論。在近期內,我想我可能會堅持使用json2.js或(如果我正在解析來自不可信或半可信來源的數據)您指定的非eval json_parse.js和json_parse_state.js備選方案Crockford的[github頁面](https://github.com/douglascrockford/JSON-js/)。 – 2010-12-08 10:04:32