Strumenti per sviluppatori · JSON formattatore e validatore
Chiavi duplicate in JSON: cosa consente RFC 8259 e cosa fanno i parser
· Sfondo
json standard convalida
La grammatica di JSON consente la stessa chiave due volte, le specifiche dicono solo che i nomi "dovrebbero" essere univoci e i parser non sono d'accordo su quale valore vinca. Questo post spiega perché ciò è importante per la correttezza e la sicurezza.
Quale "ruolo" ha letto il server?
Considera `{"role":"viewer","role":"editor"}`. Entrambi i membri sono grammaticalmente completi, quindi ToolAcre segnala JSON valido. Quando il testo raggiunge `JSON.parse`, l'oggetto risultante ha una proprietà `role` il cui valore è `"editor"`. Il membro precedente non viene conservato come cronologia nascosta. Un controllo sintattico riuscito quindi non fornisce alcuna risposta sul fatto se i nomi degli oggetti siano comparsi più di una volta.
La formattazione rende visibile la perdita solo dopo che è avvenuta: l'output contiene `{"role":"editor"}` nel layout scelto. Non può riprodurre il membro `viewer` scartato perché la serializzazione riceve l'oggetto analizzato, non la sequenza del membro originale. Se i nomi ripetuti sono importanti per una revisione, conserva e controlla il testo di origine prima di premere Formato anziché fare affidamento sul risultato normalizzato.
La grammatica lo consente, le specifiche lo scoraggiano
RFC 8259 dice che i nomi all'interno di un oggetto dovrebbero essere univoci. Ciò "dovrebbe" promuove l'output interoperabile senza rendere l'unicità parte della grammatica di base dell'oggetto. Un nome ripetuto è comunque costituito da una stringa valida, due punti e un valore nella posizione corretta separati da virgole. Di conseguenza, un validatore grammaticale può accettare il documento mentre una policy applicativa lo rifiuta.
Questa distinzione è facile da perdere perché molti errori sono errori di sintassi obbligatori: due punti mancanti o una virgola finale non possono affatto formare un oggetto JSON. I duplicati sono diversi. Creano una domanda di interoperabilità dopo che il parser ha riconosciuto ogni token. ToolAcre si ferma intenzionalmente alla sintassi e non aggiunge una regola di nome duplicato, quindi il suo risultato Valid non deve essere letto come una garanzia di unicità.
Cosa fanno JSON.parse e ToolAcre
`JSON.parse` utilizza l'occorrenza successiva quando i nomi degli oggetti si ripetono. ToolAcre eredita questo comportamento perché analizza prima della formattazione. Per `{"limit":10,"limit":25,"unit":"items"}`, la convalida ha esito positivo, il limite analizzato è 25 e l'output formattato contiene un `limit`. L'ordinamento facoltativo delle chiavi può riposizionare la proprietà sopravvissuta ma non può esporre l'occorrenza sovrascritta.
Non generalizzare quel risultato a ogni parser o configurazione. Alcuni sistemi possono rifiutare i duplicati e altri stack di elaborazione possono applicare una politica diversa o ispezionare i token prima di costruire un oggetto. L'affermazione sicura tra sistemi è ristretta: i nomi ripetuti non sono interoperabili in modo affidabile. Controllare le effettive modalità del parser utilizzate a ciascun confine quando la distinzione è importante, piuttosto che fare affidamento su un'affermazione a livello di lingua.
Quando il disaccordo tra parser diventa un rischio
I duplicati diventano un problema di sicurezza solo in un percorso concreto a più fasi in cui i componenti interpretano lo stesso testo in modo diverso. Ad esempio, un filtro di richiesta potrebbe ispezionare un'occorrenza mentre l'applicazione ne consuma un'altra. Se ciò possa accadere dipende dagli esatti parser, dalle opzioni, dal comportamento di inoltro e dall'utilizzo del campo. La sintassi duplicata da sola non dimostra un bypass sfruttabile.
Il controllo difendibile consiste nello stabilire una politica al confine della fiducia e testare lo stack reale. Rifiuta i nomi duplicati prima della costruzione di oggetti con perdita di dati quando l'ambiguità è inaccettabile o assicurati che ogni componente riceva la stessa rappresentazione già analizzata. ToolAcre può dimostrare il proprio comportamento di formattazione last-wins, ma non può controllare gateway, framework o servizi che non fanno parte dello strumento del browser.
Esempio realizzato: un documento con una chiave ripetuta
Incolla `{"theme":"light","prefs":{"density":"roomy","density":"compact"},"theme":"dark"}`. ToolAcre accetta il testo perché ogni membro è sintatticamente valido. L'analisi lascia il tema principale come `dark` e la densità nidificata come `compact`. La formattazione emette una copia di ciascun nome, quindi entrambi i valori precedenti scompaiono dal documento visualizzato.
Questo esempio mostra anche perché la ricerca del risultato formattato è troppo tardi. Il rilevamento duplicato deve osservare i nomi dei membri durante la lettura del flusso di token originale, a ogni profondità dell'oggetto. Gli array non necessitano di una regola per i nomi duplicati, sebbene regole applicative separate possano interessarsi ai valori degli elementi ripetuti. Mantieni l'origine invariata, esegui un parser o un linter in grado di riconoscere i duplicati e decidi se la policy è di avviso o di rifiuto.
Rilevamento duplicati di proposito
Utilizza strumenti che promettano esplicitamente il rilevamento di nomi duplicati sull'origine JSON. Gli approcci adatti includono una modalità parser che fallisce in caso di ripetizioni, un gestore di token di streaming che tiene traccia dei nomi per ogni oggetto aperto o un linter con una regola di chiave duplicata documentata. Verifica gli oggetti nidificati e i nomi con escape: `"name"` e `"name"` decodificano con lo stesso nome membro anche se l'ortografia di origine è diversa.
JSON Lo schema non è un sostituto una volta che l'analisi ordinaria ha scartato le occorrenze precedenti. Un validatore di schema riceve in genere il valore costruito e vede una proprietà, non la cronologia dei token duplicati. Esegui il controllo dell'univocità prima o durante l'analisi, quindi applica i controlli dello schema al valore non ambiguo. ToolAcre non esegue né il rilevamento dei duplicati né la convalida dello schema, quindi entrambi richiedono un passaggio separato e specifico.
Ciò che questo non copre
I nomi degli oggetti ripetuti non corrispondono ai valori ripetuti nei record. `[ {"id":7}, {"id":7} ]` contiene due oggetti separati, ciascuno con un `id`; per rilevare un identificatore duplicato esiste una regola del set di dati. Allo stesso modo, due elementi dell'array con la stessa stringa rimangono due posizioni intenzionali a meno che un contratto dell'applicazione non affermi che l'array rappresenta un insieme.
Questo articolo non rivendica una politica universale di primi vincitori, ultimi vincitori o di rifiuto per ampi ecosistemi linguistici. Registra il comportamento osservabile `JSON.parse` di ToolAcre e spiega perché un altro componente deve essere controllato direttamente. Inoltre, non determina la sfruttabilità solo da un duplicato. L'impatto sulla sicurezza richiede la prova che interpretazioni diverse oltrepassino un limite rilevante di autorizzazione, instradamento o convalida.
Conclusione: JSON valido non è sempre inequivocabile JSON
Un risultato valido ToolAcre significa che la sequenza del token è rigorosa JSON; ciò non significa che ogni nome di oggetto sia univoco. `JSON.parse` mantiene l'ultimo valore per un nome ripetuto e la formattazione serializza solo quel sopravvissuto. Poiché l'occorrenza precedente viene cancellata, l'output formattato non è una prova adeguata per decidere se la fonte originale contenesse duplicati.
Quando l'unicità è importante, controlla il testo originale con strumenti in grado di riconoscere i duplicati prima dell'analisi o della formattazione ordinaria. Applicare successivamente la convalida dello schema e del dominio al valore univoco risultante. Per la verifica della sicurezza, traccia il percorso effettivo della richiesta e le impostazioni del parser invece di dare per scontato un disaccordo. La regola pratica è semplice: l'accettazione della sintassi, la politica dei nomi duplicati e il significato a valle sono controlli separati con prove separate.