2011-01-31 90 views
6

在那裏?在json對象內執行javascript代碼?

所以像:

{ key1 : "val1", key2: "val2", some_code: "document.getElementById("someid").innerHTML='test';" } 

所以some_code將無需用戶干預執行?

+0

如下所示,是的,你可以。但是,最好避免。如果您向第三方提供此應該被阻止。 – 2011-01-31 10:44:28

回答

2

這是可以做到的,是的,例如,通過這樣做:

{ 
    "functionName": function() { 
    alert('Hello!'); 
    }() 
} 

但是,這不會是有效的JSON了。 JSON不接受函數。

+0

嗯 - 有點難以構建,並將該結構從後端服務器傳遞到客戶端瀏覽器? – 2011-01-31 13:08:24

3

這不會是JSON了。但你可以後處理解析的JSON:

json.some_code = eval(json.some_code); 

但是這可能是危險的(腳本注入等)。

所以,如果你可以做到這一點,而不是:

json = { key1 : "val1", key2: "val2", elem: "someid", html:"test" }; 
document.getElementById(json.elem).innerHTML=json.html; 
0

哦,首先你需要轉義雙引號:(或者使用單引號)

{ key1 : "val1", key2: "val2", some_code: "document.getElementById(\"someid\").innerHTML='test';" } 

如果您想將some_code字段評估爲腳本,就如同將它傳遞給評估一樣簡單:

eval(obj.some_code); 

這當然是非常危險的,除非您對some_code的內容有絕對的控制權。

2

首先,您的示例不是有效的JSON。試試JSON validator

其次,JSON是一種數據交換標準,當正確解析時,任何內部的代碼都不會被執行。

閱讀JSON security issues

經驗法則:不要使用JavaScript eval函數,而要使用現成的解析器,如Douglas Crockford的JSON evaluator

+0

好的,謝謝你們 - 我認爲id probaly堅持 - json作爲數據,並且沒有可能的方式來「自我執行」json對象。 – 2011-01-31 13:21:15