Ini mencegah pengungkapan tanggapan melalui pembajakan JSON.
Secara teori, konten respons HTTP dilindungi oleh Kebijakan Asal Sama: halaman dari satu domain tidak dapat memperoleh informasi apa pun dari halaman di domain lain (kecuali diizinkan secara eksplisit).
Seorang penyerang dapat meminta halaman pada domain lain atas nama Anda, misalnya dengan menggunakan <script src=...>
atau <img>
tag, tetapi tidak bisa mendapatkan informasi tentang hasil (header, isi).
Jadi, jika Anda mengunjungi halaman penyerang, itu tidak dapat membaca email Anda dari gmail.com.
Kecuali bahwa ketika menggunakan tag skrip untuk meminta konten JSON, JSON dieksekusi sebagai Javascript di lingkungan yang dikontrol penyerang. Jika penyerang dapat mengganti Array atau Object constructor atau metode lain yang digunakan selama konstruksi objek, apa pun di JSON akan melewati kode penyerang, dan diungkapkan.
Perhatikan bahwa ini terjadi pada saat JSON dieksekusi sebagai Javascript, bukan pada saat diuraikan.
Ada beberapa penanggulangan:
Memastikan JSON tidak pernah dieksekusi
Dengan menempatkan while(1);
pernyataan di depan data JSON, Google memastikan bahwa data JSON tidak pernah dieksekusi sebagai Javascript.
Hanya halaman yang sah yang bisa mendapatkan seluruh konten, menanggalkan while(1);
, dan menguraikan sisanya sebagai JSON.
Hal-hal seperti for(;;);
telah terlihat di Facebook misalnya, dengan hasil yang sama.
Memastikan JSON tidak Javascript yang valid
Demikian pula, menambahkan token yang tidak valid sebelum JSON, seperti &&&START&&&
, memastikan bahwa itu tidak pernah dieksekusi.
Selalu kembalikan JSON dengan Objek di luar
Ini adalah OWASP
cara yang disarankan untuk melindungi dari pembajakan JSON dan merupakan cara yang tidak terlalu mengganggu.
Mirip dengan langkah-langkah balasan sebelumnya, memastikan bahwa JSON tidak pernah dieksekusi sebagai Javascript.
Objek JSON yang valid, ketika tidak tertutup oleh apa pun, tidak valid dalam Javascript:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
Namun ini adalah JSON yang valid:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
Jadi, pastikan Anda selalu mengembalikan Objek di tingkat teratas dari respons, pastikan JSON tidak Javascript yang valid, sementara JSON masih valid.
Seperti dicatat oleh @hvd dalam komentar, objek kosong {}
Javascript yang valid, dan mengetahui objek kosong itu sendiri dapat menjadi informasi berharga.
Perbandingan metode di atas
Cara OWASP kurang mengganggu, karena tidak memerlukan perubahan pustaka klien, dan transfer JSON yang valid. Tidak yakin apakah bug browser masa lalu atau masa depan dapat mengalahkan ini. Seperti dicatat oleh @oriadam, tidak jelas apakah data dapat bocor dalam kesalahan parse melalui penanganan kesalahan atau tidak (misalnya window.onerror).
Cara Google mengharuskan perpustakaan klien untuk mendukung de-serialisasi otomatis dan dapat dianggap lebih aman tentang bug browser.
Kedua metode ini membutuhkan perubahan sisi server untuk menghindari pengembang dari mengirimkan JSON rentan secara tidak sengaja.