Saya menggunakan Backbone.js dan server web Tornado. Perilaku standar untuk menerima data pengumpulan di Backbone adalah mengirim sebagai JSON Array.
Di sisi lain, perilaku standar Tornado adalah untuk tidak mengizinkan JSON Array karena kerentanan berikut:
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
Yang terkait adalah: http://haacked.com/archive/2009/06/25/json-hijacking.aspx
Rasanya lebih alami bagi saya untuk tidak harus membungkus JSON saya dalam suatu objek ketika itu benar-benar daftar objek.
Saya tidak dapat mereproduksi serangan ini di browser modern (yaitu Chrome, Firefox, Safari, dan IE9 saat ini). Pada saat yang sama saya tidak dapat mengkonfirmasi di mana pun bahwa browser modern telah mengatasi masalah ini.
Untuk memastikan bahwa saya tidak menyesatkan baik oleh keterampilan pemrograman yang buruk maupun keterampilan googling yang buruk:
Apakah serangan Pembajakan JSON ini masih menjadi masalah saat ini di browser modern?
(Catatan: Maaf untuk kemungkinan duplikat ke: Apakah mungkin untuk melakukan 'pembajakan JSON' di browser modern? Tetapi karena jawaban yang diterima tampaknya tidak menjawab pertanyaan - Saya pikir sudah waktunya untuk bertanya lagi dan mendapatkan beberapa penjelasan yang lebih jelas. .)
Jawaban:
Tidak, tidak lagi mungkin untuk mengambil nilai yang diteruskan ke
[]
atau{}
konstruktor di Firefox 21, Chrome 27, atau IE 10. Berikut adalah halaman uji kecil, berdasarkan serangan utama yang dijelaskan dalam http://www.thespanner.co.uk / 2011/05/30 / json-pembajakan / :( http://jsfiddle.net/ph3Uv/2/ )
Mengganti
window.Array
dan menambahkan setter keObject.prototype.foo
dan menguji inisialisasi array dan objek melalui formulir pendek dan panjang.The ES4 spesifikasi , dalam bagian 1.5, "memerlukan global, binding standar Obyek dan Array yang akan digunakan untuk membangun objek baru untuk objek dan array yang initializers" dan catatan dalam Implementasi Preseden bahwa "Internet Explorer 6, Opera 9.20, dan Safari 3 do tidak menghormati penghindaran Object dan Array lokal atau global, tetapi gunakan konstruktor Object and Array yang asli. " Ini dipertahankan dalam ES5, bagian 11.1.4 .
Allen Wirfs-Brock menjelaskan bahwa ES5 juga menentukan bahwa inisialisasi objek tidak boleh memicu setter, karena menggunakan DefineOwnProperty. MDN: Bekerja dengan Objects mencatat bahwa "Mulai dalam JavaScript 1.8.1, setter tidak lagi dipanggil saat menyetel properti di inisialisasi objek dan array." Ini telah diatasi dalam edisi V8 1015 .
sumber