簡體   English   中英

JSON Hijacking在現代瀏覽器中仍然是一個問題嗎?

[英]Is JSON Hijacking still an issue in modern browsers?

我正在使用Backbone.js和Tornado Web服務器。 在Backbone中接收集合數據的標准行為是作為JSON數組發送。

另一方面,由於以下漏洞,Tornado的標准行為是不允許使用JSON Array:

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)。 與此同時,我無法確認現代瀏覽器解決這些問題的任何地方。

為了確保我既沒有任何可能的糟糕的編程技能,也沒有糟糕的谷歌搜索技能:

在現代瀏覽器中,這些JSON劫持攻擊現在仍然是一個問題嗎?

(注意:很抱歉可能重復: 在現代瀏覽器上可以進行'JSON劫持'嗎?但由於接受的答案似乎沒有回答這個問題 - 我認為現在是時候再問一遍並得到一些更明確的解釋。)

不,不再可能捕獲傳遞給Firefox 21,Chrome 27或IE 10中的[]{}構造函數的值。這是一個小測試頁面,基於http://www.thespanner中描述的主要攻擊.co.uk / 2011/05/30 / json-hijacking /

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

 var capture = function() { var ta = document.querySelector('textarea') ta.innerHTML = ''; ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments))); return arguments; } var original = Array; var toggle = document.body.querySelector('input[type="checkbox"]'); var toggleCapture = function() { var isOn = toggle.checked; window.Array = isOn ? capture : original; if (isOn) { Object.defineProperty(Object.prototype, 'foo', {set: capture}); } else { delete Object.prototype.foo; } }; toggle.addEventListener('click', toggleCapture); toggleCapture(); [].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) { el.addEventListener('click', function() { document.querySelector('textarea').innerHTML = 'Safe.'; eval(this.value); }); }); 
 <div><label><input type="checkbox" checked="checked"> Capture</label></div> <div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div> <div><textarea></textarea></div> 

它覆蓋window.Array並增加了一個設置器, Object.prototype.foo和試驗通過短和長形式初始化數組和對象。

第1.5節中的ES4規范 “需要使用Object和Array的全局標准綁定來構造對象和數組初始化器的新對象”,並在實現先例中指出“Internet Explorer 6,Opera 9.20和Safari 3”不尊重Object和Array的本地或全局重新綁定,而是使用原始的Object和Array構造函數。“ 這在第5.1節第11.1.4節中保留。

Allen Wirfs-Brock解釋說ES5還指定對象初始化不應該觸發setter,因為它使用DefineOwnProperty。 MDN:使用對象注意到“從JavaScript 1.8.1開始,在對象和數組初始值設定項中設置屬性時不再調用setter。” 這在V8問題1015中得到了解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM