2012-01-12 113 views
2

它足夠簡單創建一個JSON對象是這樣的:在JSON中傳遞JS函數有哪些XSS危險?

{ 「鍵」: 「值」, 「myFunction的」:函數(){警報( '喜'); }}

並將它從服務器傳遞到可以調用myFunction()的腳本。果然,該功能起作用,我收到一條警告:「嗨」。對我來說,這可能是保持腳本尺寸很小的一種非常有用的方法。 但是,我相信在傳遞函數中存在XSS危險,而不僅僅是通過JSON數據。有人可以解釋這些是什麼,如果適當的話,可以採取什麼措施來否定它們?

回答

2

function不是JSON的一部分,因爲JSON不是JavaScript。

大多數庫都使用JSON解析器(當它們可以的時候,browser's one)。所以這不會被正確解析。儘管使用eval來解析JSON是邪惡eval是邪惡的一般。

而你一直在使用<script>加載JavaScript,所以我在這裏看不到有關XSS的問題。

0

這取決於你如何加載和解析JSON。如果您使用jQuery並通過AJAX加載數據,那麼該數據將傳遞給瀏覽器的內置JSON解析器,該解析器不支持greut所解釋的函數。 http://erlend.oftedal.no/blog/misc/json/index.html

然而,如果你加載它通過兩種JSONP(纏繞它的功能),由JSON在例如像Socialcast頁面是否結束在腳本標籤直接添加它,那麼它的脆弱。 http://erlend.oftedal.no/blog/misc/json/index2.html

如果您遇到了最後一個問題,您應該記住JSON值(和鍵)應該總是包裹在「」中。所以如果你從不受信任的數據構建JSON,你必須記住JSON對它進行編碼。這有點類似於Javascript編碼,除了JSON有一些額外的怪癖。例如,您可以擁有一個有效的JSON文件,該文件不是有效的JavaScript,因爲它包含JSON中允許的字符,但需要使用JavaScript進行編碼。