最近更新: 2007-01-10

JSON 的安全性

JSON 是 JavaScript 語言的子集合,在 JavaScript 中透過 eval() 喚醒 JSON object 。但 eval() 是個泛用性功能,一句不當的 eval() 操作,足以讓惡意人士在 JSON 內容中植入可執行性敘述達成破壞目的。

此安全性狀況只發生在 JavaScript 中,而其他程式語言由於語法不同兼且多數透過專屬函數編碼與解碼 JSON ,反而無此顧慮。

eval() 喚起 JSON object 的適當方式是以小括號括起 JSON 內容,而最常見的錯誤便是省略小括號。見下例。

var jsonObject = '[], alert("HA HA HA!")';

var i = eval( '('+ jsonString + ')' ); //Syntax error.

var j = eval(jsonString); //DANGER!

其實在 JSON 規範 (RFC4627) 第六節就有提到這些內容,並且提供了正確且安全的調用方法。

A JSON text can be safely passed into JavaScript's eval() function (which compiles and executes a string) if all the characters not enclosed in strings are in the set of characters that form JSON tokens. This can be quickly determined in JavaScript with two regular expressions and calls to the test and replace methods. RFC4627
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ''))) 
&& eval('(' + text + ')');
相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/2636558.html

樂多舊回應
未留名 (#comment-3873051)
Tue, 23 Jan 2007 09:54:16 +0800
include 官方 json.js 以後,可以調用 parseJSON(),這樣會比較方便。
如:var i = jsonString.parseJSON();
未留名 (#comment-3873414)
Tue, 23 Jan 2007 12:14:59 +0800
我補充一下,「官方」是指 http://www.json.org/ 網站。
官方 json.js 在此: http://www.json.org/js.html