Alat pengembang · JSON pemformat & validator
Kunci duplikat di JSON: apa yang diizinkan RFC 8259 dan apa yang dilakukan parser
· Latar belakang
json standar validasi
Tata bahasa JSON mengizinkan kunci yang sama dua kali, spesifikasi hanya mengatakan nama 'harus' unik, dan parser tidak setuju tentang nilai mana yang menang. Posting ini menjelaskan mengapa hal itu penting untuk kebenaran dan keamanan.
'Peran' manakah yang dibaca server?
Pertimbangkan `{"role":"viewer","role":"editor"}`. Kedua anggota tersebut lengkap secara tata bahasa, jadi ToolAcre melaporkan JSON yang valid. Ketika teks mencapai `JSON.parse`, objek yang dihasilkan memiliki satu properti `role` yang nilainya `"editor"`. Anggota sebelumnya tidak disimpan sebagai riwayat tersembunyi. Oleh karena itu, pemeriksaan sintaksis yang berhasil tidak menjawab apa pun tentang apakah nama objek muncul lebih dari satu kali.
Pemformatan membuat kerugian hanya terlihat setelah terjadi: output berisi `{"role":"editor"}` dalam tata letak yang dipilih. Itu tidak dapat mereproduksi anggota `viewer` yang dibuang karena serialisasi menerima objek yang diuraikan, bukan urutan anggota asli. Jika nama berulang penting untuk peninjauan, pertahankan dan periksa teks sumber sebelum menekan Format daripada mengandalkan hasil yang dinormalisasi.
Tata bahasanya memungkinkan, spesifikasinya menghalanginya
RFC 8259 mengatakan nama dalam suatu objek harus unik. Kata "seharusnya" mendorong keluaran yang dapat dioperasikan tanpa menjadikan keunikan sebagai bagian dari tata bahasa objek dasar. Nama yang diulang tetap terdiri dari string, titik dua, dan nilai yang valid dalam posisi yang dipisahkan koma dengan benar. Akibatnya, validator tata bahasa dapat menerima dokumen tersebut sementara kebijakan aplikasi menolaknya.
Perbedaan ini mudah untuk dilewatkan karena banyak kesalahan yang merupakan kegagalan sintaksis wajib: titik dua yang hilang atau koma di akhir tidak dapat membentuk objek JSON sama sekali. Duplikatnya berbeda. Mereka membuat pertanyaan interoperabilitas setelah parser mengenali setiap token. ToolAcre sengaja berhenti pada sintaksis dan tidak menambahkan aturan nama duplikat, sehingga hasil Validnya tidak boleh dibaca sebagai jaminan keunikan.
Apa yang dilakukan JSON.parse dan ToolAcre
`JSON.parse` menggunakan kejadian selanjutnya ketika nama objek diulang. ToolAcre mewarisi perilaku tersebut karena diurai sebelum diformat. Untuk `{"limit":10,"limit":25,"unit":"items"}`, validasi berhasil, batas yang diurai adalah 25, dan keluaran yang diformat berisi satu `limit`. Penyortiran kunci opsional dapat mengubah posisi properti yang masih ada tetapi tidak dapat mengekspos kejadian yang ditimpa.
Jangan menggeneralisasi hasil tersebut ke setiap parser atau konfigurasi. Beberapa sistem dapat menolak duplikat, dan tumpukan pemrosesan lainnya mungkin menerapkan kebijakan berbeda atau memeriksa token sebelum membuat objek. Pernyataan lintas sistem yang aman itu sempit: nama yang berulang tidak dapat dioperasikan secara andal. Periksa mode parser sebenarnya yang digunakan pada setiap batas ketika perbedaan itu penting, daripada mengandalkan klaim dalam seluruh bahasa.
Ketika ketidaksepakatan parser menjadi risiko
Duplikat menjadi masalah keamanan hanya dalam jalur multi-tahap konkret di mana komponen menafsirkan teks yang sama secara berbeda. Misalnya, filter permintaan mungkin memeriksa satu kejadian sementara aplikasi menggunakan kejadian lainnya. Apakah hal ini dapat terjadi bergantung pada parser, opsi, perilaku penerusan, dan penggunaan lapangan yang tepat. Sintaks duplikat saja tidak membuktikan adanya bypass yang dapat dieksploitasi.
Kontrol yang dapat dipertahankan adalah dengan menetapkan satu kebijakan pada batas kepercayaan dan menguji tumpukan sebenarnya. Tolak nama duplikat sebelum konstruksi objek lossy ketika ambiguitas tidak dapat diterima, atau pastikan setiap komponen menerima representasi yang sama yang sudah diurai. ToolAcre dapat menunjukkan perilaku pemformatan kemenangan terakhirnya sendiri, namun tidak dapat mengaudit gateway, kerangka kerja, atau layanan yang bukan bagian dari alat browser.
Contoh praktis: dokumen dengan kunci berulang
Tempel `{"theme":"light","prefs":{"density":"roomy","density":"compact"},"theme":"dark"}`. ToolAcre menerima teks karena setiap anggota valid secara sintaksis. Penguraian menyisakan tema akar sebagai `dark` dan kepadatan bersarang sebagai `compact`. Pemformatan mengeluarkan satu salinan dari setiap nama, sehingga kedua nilai sebelumnya hilang dari dokumen yang ditampilkan.
Contoh tersebut juga menunjukkan mengapa pencarian hasil yang diformat terlambat. Deteksi duplikat harus mengamati nama anggota saat membaca aliran token asli, di setiap kedalaman objek. Array tidak memerlukan aturan nama duplikat, meskipun aturan aplikasi terpisah mungkin memperhatikan nilai elemen yang berulang. Jaga agar sumber tidak berubah, jalankan parser atau linter yang peka terhadap duplikat, dan putuskan apakah kebijakan tersebut berupa peringatan atau penolakan.
Mendeteksi duplikat dengan sengaja
Gunakan alat yang secara eksplisit menjanjikan deteksi nama duplikat pada sumber JSON. Pendekatan yang sesuai mencakup mode parser yang gagal pada pengulangan, pengendali token streaming yang melacak nama untuk setiap objek terbuka, atau linter dengan aturan kunci duplikat yang terdokumentasi. Verifikasi objek bersarang dan nama yang lolos: `"name"` dan `"name"` dekode ke nama anggota yang sama meskipun ejaan sumbernya berbeda.
JSON Skema bukan pengganti setelah penguraian biasa membuang kejadian sebelumnya. Validator skema biasanya menerima nilai yang dibangun dan melihat satu properti, bukan riwayat token duplikat. Jalankan pemeriksaan keunikan sebelum atau selama penguraian, lalu terapkan pemeriksaan skema ke nilai yang tidak ambigu. ToolAcre tidak melakukan deteksi duplikat maupun validasi skema, sehingga keduanya memerlukan langkah terpisah yang dibuat khusus.
Hal ini tidak tercakup dalam hal ini
Nama objek yang diulang tidak sama dengan nilai yang diulang di seluruh rekaman. `[ {"id":7}, {"id":7} ]` berisi dua objek terpisah, masing-masing dengan satu `id`; mendeteksi pengidentifikasi duplikat ada aturan kumpulan data. Demikian pula, dua elemen larik dengan string yang sama tetap berada pada dua posisi yang disengaja kecuali kontrak aplikasi menyatakan bahwa larik tersebut mewakili suatu himpunan.
Artikel ini tidak mengklaim adanya kebijakan kemenangan pertama, kemenangan terakhir, atau penolakan universal untuk ekosistem bahasa yang luas. Ini mencatat perilaku `JSON.parse` yang dapat diamati ToolAcre dan menjelaskan mengapa komponen lain harus diperiksa secara langsung. Hal ini juga tidak menentukan eksploitasi dari duplikat saja. Dampak keamanan memerlukan bukti bahwa interpretasi yang berbeda melintasi batas otorisasi, perutean, atau validasi yang relevan.
Kesimpulan: JSON yang valid tidak selalu jelas JSON
Hasil ToolAcre yang valid berarti urutan tokennya ketat JSON; itu tidak berarti setiap nama objek itu unik. `JSON.parse` menyimpan nilai terakhir untuk nama yang berulang, dan memformat hanya membuat serial yang bertahan saja. Karena kejadian sebelumnya terhapus, keluaran yang diformat merupakan bukti yang tidak sesuai untuk memutuskan apakah sumber asli berisi duplikat.
Jika keunikan penting, periksa teks asli dengan alat yang sadar akan duplikat sebelum penguraian atau pemformatan biasa. Terapkan validasi skema dan domain setelahnya ke nilai jelas yang dihasilkan. Untuk tinjauan keamanan, lacak jalur permintaan aktual dan pengaturan parser alih-alih berasumsi bahwa ada ketidaksepakatan. Aturan praktisnya sederhana: penerimaan sintaksis, kebijakan nama duplikat, dan makna hilir merupakan pemeriksaan terpisah dengan bukti terpisah.