Używam Backbone.js i serwera WWW Tornado. Standardowym zachowaniem podczas odbierania danych kolekcji w Backbone jest wysyłanie jako tablica JSON.
Z drugiej strony standardowym zachowaniem Tornado jest uniemożliwienie korzystania z tablic JSON ze względu na następującą lukę:
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
Powiązany to: http://haacked.com/archive/2009/06/25/json-hijacking.aspx
Wydaje mi się bardziej naturalne, że nie muszę zawijać mojego kodu JSON w obiekcie, gdy tak naprawdę jest to lista obiektów.
Nie byłem w stanie odtworzyć tych ataków w nowoczesnych przeglądarkach (tj. Aktualnej przeglądarce Chrome, Firefox, Safari i IE9). Jednocześnie nigdzie nie byłem w stanie potwierdzić, że nowoczesne przeglądarki rozwiązały te problemy.
Aby upewnić się, że nie wprowadzają mnie w błąd żadne możliwe słabe umiejętności programowania ani słabe umiejętności googlowania:
Czy ataki typu JSON Hijacking nadal stanowią problem w nowoczesnych przeglądarkach?
(Uwaga: przepraszam za możliwy duplikat: Czy można zrobić `` przechwytywanie JSON '' w nowoczesnej przeglądarce? Ale ponieważ zaakceptowana odpowiedź nie wydaje się odpowiadać na pytanie - pomyślałem, że nadszedł czas, aby zadać to ponownie i uzyskać jaśniejsze wyjaśnienia .)
Odpowiedzi:
Nie, nie jest już możliwe przechwytywanie wartości przekazywanych do konstruktorów
[]
lub{}
w przeglądarkach Firefox 21, Chrome 27 lub IE 10. Oto mała strona testowa oparta na głównych atakach opisanych na http://www.thespanner.co.uk / 2011/05/30 / json-hijacking / :( http://jsfiddle.net/ph3Uv/2/ )
Zastępuje
window.Array
i dodaje metodę ustawiającąObject.prototype.foo
oraz testuje inicjalizację tablic i obiektów za pomocą krótkich i długich formularzy.Specyfikacja ES4 , w sekcji 1.5, „wymaga użycia globalnych, standardowych powiązań Object i Array do konstruowania nowych obiektów dla inicjatorów obiektów i tablic” oraz uwagi w poprzedniej implementacji, że „Internet Explorer 6, Opera 9.20 i Safari 3 wymagają nie respektuje ani lokalnych, ani globalnych ponownych wiązań Object i Array, ale używa oryginalnych konstruktorów Object i Array. ” Zostało to zachowane w ES5, sekcja 11.1.4 .
Allen Wirfs-Brock wyjaśnił, że ES5 określa również, że inicjalizacja obiektu nie powinna wyzwalać seterów, ponieważ używa DefineOwnProperty. MDN: Working with Objects zauważa, że „Począwszy od JavaScript 1.8.1, metody ustawiające nie są już wywoływane podczas ustawiania właściwości w inicjatorach obiektów i tablic”. Ten problem został rozwiązany w numerze 1015 V8 .
źródło