Alat pembangun · JSON pemformat & pengesah
Kekunci pendua dalam JSON: perkara yang RFC 8259 dibenarkan dan perkara yang dilakukan oleh penghurai
· Latar belakang
json piawaian pengesahan
Tatabahasa JSON membenarkan kunci yang sama dua kali, spesifikasi sahaja menyatakan nama 'sepatutnya' unik dan penghurai tidak bersetuju tentang nilai yang menang. Siaran ini menerangkan sebab itu penting untuk ketepatan dan keselamatan.
'Peranan' manakah yang dibaca oleh pelayan?
Pertimbangkan `{"role":"viewer","role":"editor"}`. Kedua-dua ahli adalah lengkap dari segi tatabahasa, jadi ToolAcre melaporkan sah JSON. Apabila teks mencapai `JSON.parse`, objek yang terhasil mempunyai satu sifat `role` yang nilainya ialah `"editor"`. Ahli terdahulu tidak dikekalkan sebagai sejarah tersembunyi. Oleh itu, semakan sintaks yang berjaya tidak menjawab apa-apa tentang sama ada nama objek muncul lebih daripada sekali.
Pemformatan menjadikan kehilangan kelihatan sahaja selepas ia berlaku: output mengandungi `{"role":"editor"}` dalam reka letak yang dipilih. Ia tidak boleh mengeluarkan semula ahli `viewer` yang dibuang kerana siri menerima objek yang dihuraikan, bukan jujukan ahli asal. Jika nama berulang penting untuk semakan, simpan dan periksa teks sumber sebelum menekan Format dan bukannya bergantung pada hasil yang dinormalkan.
Tatabahasa membenarkannya, spec tidak menggalakkannya
RFC 8259 mengatakan nama dalam objek mestilah unik. Itu "sepatutnya" menggalakkan output saling kendali tanpa menjadikan keunikan sebahagian daripada tatabahasa objek asas. Nama yang berulang masih mengandungi rentetan, titik bertindih dan nilai yang sah dalam kedudukan dipisahkan koma yang betul. Akibatnya, pengesah tatabahasa boleh menerima dokumen tersebut manakala dasar permohonan menolaknya.
Perbezaan ini mudah terlepas kerana banyak ralat adalah kegagalan sintaks wajib: titik bertindih atau koma di belakang yang hilang tidak boleh membentuk objek JSON sama sekali. Pendua adalah berbeza. Mereka mencipta soalan saling kendali selepas penghurai mengenali setiap token. ToolAcre sengaja berhenti pada sintaks dan tidak menambah peraturan nama pendua, jadi hasil Sahnya tidak boleh dibaca sebagai jaminan keunikan.
Perkara yang JSON.parse dan ToolAcre lakukan
`JSON.parse` menggunakan kejadian kemudian apabila nama objek berulang. ToolAcre mewarisi tingkah laku itu kerana ia menghuraikan sebelum memformat. Untuk `{"limit":10,"limit":25,"unit":"items"}`, pengesahan berjaya, had yang dihuraikan ialah 25 dan output yang diformatkan mengandungi satu `limit`. Pengisihan kunci pilihan boleh meletakkan semula harta yang masih hidup itu tetapi tidak boleh mendedahkan kejadian yang ditulis ganti.
Jangan umumkan hasil itu kepada setiap penghurai atau konfigurasi. Sesetengah sistem boleh menolak pendua dan tindanan pemprosesan lain mungkin menggunakan dasar yang berbeza atau memeriksa token sebelum membina objek. Pernyataan silang sistem selamat adalah sempit: nama yang berulang tidak boleh dioperasikan dengan pasti. Semak mod penghurai sebenar yang digunakan pada setiap sempadan apabila perbezaan itu penting, dan bukannya bergantung pada tuntutan seluruh bahasa.
Apabila perselisihan penghuraian menjadi risiko
Pendua menjadi kebimbangan keselamatan sahaja dalam laluan berbilang peringkat konkrit di mana komponen mentafsir teks yang sama secara berbeza. Sebagai contoh, penapis permintaan mungkin memeriksa satu kejadian sementara aplikasi menggunakan yang lain. Sama ada itu boleh berlaku bergantung pada penghurai yang tepat, pilihan, tingkah laku pemajuan dan penggunaan medan. Sintaks pendua sahaja tidak membuktikan pintasan yang boleh dieksploitasi.
Kawalan yang boleh dipertahankan adalah untuk mewujudkan satu dasar di sempadan amanah dan menguji timbunan sebenar. Tolak nama pendua sebelum pembinaan objek lossy apabila kekaburan tidak boleh diterima, atau pastikan setiap komponen menerima perwakilan yang telah dihuraikan yang sama. ToolAcre boleh menunjukkan tingkah laku pemformatan kemenangan terakhirnya sendiri, tetapi ia tidak boleh mengaudit get laluan, rangka kerja atau perkhidmatan yang bukan sebahagian daripada alat pelayar.
Contoh yang berfungsi: dokumen dengan kunci berulang
Tampal `{"theme":"light","prefs":{"density":"roomy","density":"compact"},"theme":"dark"}`. ToolAcre menerima teks kerana setiap ahli adalah sah dari segi sintaksis. Penghuraian meninggalkan tema akar sebagai `dark` dan ketumpatan bersarang sebagai `compact`. Pemformatan mengeluarkan satu salinan setiap nama, jadi kedua-dua nilai terdahulu hilang daripada dokumen yang dipaparkan.
Contoh itu juga menunjukkan sebab mencari hasil yang diformatkan sudah terlambat. Pengesanan pendua mesti memerhati nama ahli semasa membaca aliran token asal, pada setiap kedalaman objek. Tatasusunan tidak memerlukan peraturan nama pendua, walaupun peraturan aplikasi yang berasingan mungkin mengambil berat tentang nilai elemen berulang. Pastikan sumber tidak berubah, jalankan penghurai atau linter yang menyedari pendua terhadapnya dan tentukan sama ada dasar itu amaran atau penolakan.
Mengesan pendua dengan sengaja
Gunakan alat yang secara eksplisit menjanjikan pengesanan nama pendua pada sumber JSON. Pendekatan yang sesuai termasuk mod penghurai yang gagal berulang, pengendali token penstriman yang menjejaki nama untuk setiap objek terbuka atau linter dengan peraturan kunci pendua yang didokumenkan. Sahkan objek bersarang dan nama yang terlepas: `"name"` dan `"name"` menyahkod kepada nama ahli yang sama walaupun ejaan sumbernya berbeza.
JSON Skema bukan pengganti apabila penghuraian biasa telah membuang kejadian terdahulu. Pengesah skema biasanya menerima nilai yang dibina dan melihat satu sifat, bukan sejarah token pendua. Jalankan semakan keunikan sebelum atau semasa menghuraikan, kemudian gunakan semakan skema pada nilai yang tidak jelas. ToolAcre tidak melakukan pengesanan pendua mahupun pengesahan skema, jadi kedua-duanya memerlukan langkah berasingan yang dibina khas.
Perkara ini tidak meliputi
Nama objek berulang tidak sama dengan nilai berulang merentas rekod. `[ {"id":7}, {"id":7} ]` mengandungi dua objek berasingan, setiap satu dengan satu `id`; mengesan pengecam pendua terdapat peraturan set data. Begitu juga, dua elemen tatasusunan dengan rentetan yang sama kekal dua kedudukan yang disengajakan melainkan kontrak aplikasi mengatakan tatasusunan mewakili satu set.
Artikel ini tidak menuntut dasar menang pertama, menang terakhir atau menolak universal untuk ekosistem bahasa yang luas. Ia merekodkan tingkah laku `JSON.parse` ToolAcre yang boleh diperhatikan dan menerangkan sebab komponen lain mesti disemak terus. Ia juga tidak menentukan kebolehgunaan daripada pendua sahaja. Kesan keselamatan memerlukan bukti bahawa tafsiran yang berbeza merentasi sempadan kebenaran, penghalaan atau pengesahan yang berkaitan.
Bawa pulang: sah JSON tidak selalunya jelas JSON
A ToolAcre Keputusan yang sah bermakna urutan token adalah ketat JSON; ia tidak bermakna setiap nama objek adalah unik. `JSON.parse` menyimpan nilai terakhir untuk nama yang berulang dan pemformatan sahaja mensiri orang yang masih hidup itu. Oleh kerana kejadian awal dipadamkan, output yang diformatkan adalah bukti yang tidak sesuai untuk memutuskan sama ada sumber asal mengandungi pendua.
Apabila keunikan penting, periksa teks asal dengan alat yang menyedari pendua sebelum penghuraian atau pemformatan biasa. Gunakan skema dan pengesahan domain selepas itu kepada nilai yang tidak jelas yang terhasil. Untuk semakan keselamatan, jejaki laluan permintaan dan tetapan penghurai sebenar dan bukannya menganggap perselisihan faham. Peraturan praktikalnya mudah: penerimaan sintaks, dasar nama pendua dan makna hiliran ialah semakan berasingan dengan bukti berasingan.