2013-04-29 17 views
112

我正在使用Backbone.js和Tornado Web服務器。在Backbone中接收集合數據的標準行爲是作爲JSON數組發送。JSON劫持在現代瀏覽器中仍然是個問題嗎?

在另一方面,龍捲風的標準行爲是不允許的JSON陣列的由於以下漏洞:

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

一個相關的一個是: http://haacked.com/archive/2009/06/25/json-hijacking.aspx

感覺更自然的我當它真的是一個對象列表時,不必將我的JSON包裝在一個對象中。

我無法在現代瀏覽器(即當前的Chrome,Firefox,Safari和IE9)中再現這些攻擊。同時,我無法確認現代瀏覽器解決這些問題的任何地方。

爲了確保我不會被任何可能的差的編程技巧也不差google搜索技巧誤導:

這些是JSON劫持攻擊仍然是一個問題在今天的現代瀏覽器?

(注:對不起,我可能重複到:Is it possible to do 'JSON hijacking' on modern browser?但由於接受的答案似乎並沒有回答這個問題 - 我想是時候再次詢問,並得到了一些更清晰的解釋)

+0

使用eval?那麼否則可能否。如果沒有任何被改變或改變的方式骨幹分析響應,那麼你應該是安全的 – Deeptechtons 2013-05-03 07:20:58

+6

一般來說,你應該永遠不要接近網絡安全,假設有人將使用「現代」瀏覽器。 – Luke 2013-05-03 14:16:18

+5

@Luke - 請參閱下面對Reid的評論。一般的偉大點 - 但我不是要求一個普遍的安全問題。 (我的用戶只能在首先使用現代瀏覽器的情況下進行身份驗證。) – Rocketman 2013-05-04 17:05:13

回答

81

無,它不再是可以捕捉傳遞給[]{}構造函數值在Firefox 21,Chrome瀏覽器27或IE 10。這裏有一個小測試頁面的基礎上,http://www.thespanner.co.uk/2011/05/30/json-hijacking/描述的主要攻擊:

http://jsfiddle.net/ph3Uv/2/

它覆蓋window.Array,並將一個setter添加到Object.prototype.foo並通過短和長格式測試數組和對象的初始化。

ES4 spec在第1.5節「要求對象和數組初始化器的全局,標準綁定用於構造對象和數組初始化器的新對象」,並且在Implementation Precedent中指出「Internet Explorer 6,Opera 9.20和Safari 3不尊重對象和數組的本地或全局重新綁定,但使用原始的對象和數組構造函數。「這保留在ES5, section 11.1.4

Allen Wirfs-Brock explained ES5還指定對象初始化不應觸發setter,因爲它使用DefineOwnProperty。 MDN: Working with Objects指出:「從JavaScript 1.8.1開始,在對象和數組初始化器中設置屬性時不再調用setter。」這在V8 issue 1015中得到解決。

+18

早在2009年,Brendan Eich建議瀏覽器不要評估作爲application/json的腳本(https://bugzilla.mozilla.org/show_bug.cgi?id=376957#c75),這對我來說仍然是一個好主意。 – 2013-06-02 20:43:59

+2

請注意,盲目的POST CSRF仍然可以使用表單,特別是使用文本/純文本編碼,並且需要使用標記/隨機數打敗。 – 2013-06-02 20:48:10

+1

是的POST CSRF。感謝您在這裏的所有重要信息。 – Rocketman 2013-06-09 17:18:05

相關問題