Deutsch

Entwicklertools · JSON Formatierer und Validator

Doppelte Schlüssel in JSON: was RFC 8259 zulässt und was Parser tun

· Hintergrund

json Standards Validierung

Doppelte Schlüssel in JSON: Was RFC 8259 zulässt und was Parser tun, veranschaulicht mit JSON-Tokens und einer präzisen Validierungsgrenze
Die Grammatik von
Original-ToolAcre-Vektorillustration

JSON lässt denselben Schlüssel zweimal zu, die Spezifikation besagt nur, dass Namen eindeutig sein „sollten“, und Parser sind sich nicht einig darüber, welcher Wert gewinnt. In diesem Beitrag wird erläutert, warum dies für die Richtigkeit und Sicherheit wichtig ist.

Welche „Rolle“ hat der Server gelesen?

Betrachten Sie `{"role":"viewer","role":"editor"}`. Beide Mitglieder sind grammatikalisch vollständig, daher meldet ToolAcre gültiges JSON. Wenn der Text `JSON.parse` erreicht, verfügt das resultierende Objekt über eine Eigenschaft `role`, deren Wert `"editor"` ist. Das frühere Mitglied wird nicht als verborgener Verlauf beibehalten. Eine erfolgreiche Syntaxprüfung gibt daher keine Auskunft darüber, ob Objektnamen mehr als einmal vorkommen.

Durch die Formatierung wird der Verlust erst sichtbar, nachdem er aufgetreten ist: Die Ausgabe enthält `{"role":"editor"}` im gewählten Layout. Das verworfene Mitglied `viewer` kann nicht reproduziert werden, da die Serialisierung das analysierte Objekt und nicht die ursprüngliche Mitgliedssequenz empfängt. Wenn wiederholte Namen für eine Überprüfung von Bedeutung sind, bewahren und überprüfen Sie den Quelltext, bevor Sie auf „Formatieren“ klicken, anstatt sich auf das normalisierte Ergebnis zu verlassen.

Die Grammatik erlaubt es, die Spezifikation rät davon ab

RFC 8259 besagt, dass Namen innerhalb eines Objekts eindeutig sein sollten. Dieses „sollte“ fördert die interoperable Ausgabe, ohne die Eindeutigkeit zu einem Teil der grundlegenden Objektgrammatik zu machen. Ein wiederholter Name besteht weiterhin aus einer gültigen Zeichenfolge, einem Doppelpunkt und einem Wert an der richtigen, durch Kommas getrennten Position. Folglich kann ein Grammatikvalidator das Dokument akzeptieren, während eine Anwendungsrichtlinie es ablehnt.

Diese Unterscheidung ist leicht zu übersehen, da es sich bei vielen Fehlern um obligatorische Syntaxfehler handelt: Ein fehlender Doppelpunkt oder ein nachgestelltes Komma kann überhaupt kein JSON-Objekt bilden. Duplikate sind unterschiedlich. Sie erstellen eine Interoperabilitätsfrage, nachdem der Parser jedes Token erkannt hat. ToolAcre stoppt absichtlich bei der Syntax und fügt keine Regel für doppelte Namen hinzu, sodass das Ergebnis „Gültig“ nicht als Eindeutigkeitsgarantie gelesen werden darf.

Was JSON.parse und ToolAcre tun

`JSON.parse` verwendet das spätere Vorkommen, wenn sich Objektnamen wiederholen. ToolAcre übernimmt dieses Verhalten, da es vor der Formatierung analysiert. Für `{"limit":10,"limit":25,"unit":"items"}` ist die Validierung erfolgreich, der analysierte Grenzwert beträgt 25 und die formatierte Ausgabe enthält einen `limit`. Die optionale Schlüsselsortierung kann die verbleibende Eigenschaft neu positionieren, das überschriebene Vorkommen jedoch nicht offenlegen.

Verallgemeinern Sie dieses Ergebnis nicht auf jeden Parser oder jede Konfiguration. Einige Systeme können Duplikate ablehnen, und andere Verarbeitungsstapel wenden möglicherweise eine andere Richtlinie an oder prüfen Token, bevor sie ein Objekt erstellen. Die sichere systemübergreifende Aussage ist eng gefasst: Wiederholte Namen sind nicht zuverlässig interoperabel. Überprüfen Sie die tatsächlichen Parser-Modi, die an jeder Grenze verwendet werden, wenn es auf die Unterscheidung ankommt, anstatt sich auf einen sprachweiten Anspruch zu verlassen.

Wenn Parser-Unstimmigkeiten zum Risiko werden

Duplikate werden nur in einem konkreten mehrstufigen Pfad zu einem Sicherheitsrisiko, wenn Komponenten denselben Text unterschiedlich interpretieren. Beispielsweise könnte ein Anforderungsfilter ein Vorkommen prüfen, während die Anwendung ein anderes nutzt. Ob das passieren kann, hängt von den genauen Parsern, Optionen, Weiterleitungsverhalten und Feldnutzung ab. Eine doppelte Syntax allein stellt keine ausnutzbare Umgehung dar.

Die vertretbare Kontrolle besteht darin, eine Richtlinie an der Vertrauensgrenze einzurichten und den echten Stack zu testen. Lehnen Sie doppelte Namen vor der verlustbehafteten Objektkonstruktion ab, wenn Mehrdeutigkeit nicht akzeptabel ist, oder stellen Sie sicher, dass jede Komponente dieselbe bereits analysierte Darstellung erhält. ToolAcre kann sein eigenes Last-Wins-Formatierungsverhalten demonstrieren, es kann jedoch keine Gateways, Frameworks oder Dienste prüfen, die nicht Teil des Browser-Tools sind.

Arbeitsbeispiel: ein Dokument mit einem wiederholten Schlüssel

`{"theme":"light","prefs":{"density":"roomy","density":"compact"},"theme":"dark"}` einfügen. ToolAcre akzeptiert den Text, da jedes Mitglied syntaktisch gültig ist. Beim Parsen bleibt das Stammthema als `dark` und die verschachtelte Dichte als `compact`. Durch die Formatierung wird eine Kopie jedes Namens ausgegeben, sodass beide früheren Werte aus dem angezeigten Dokument verschwinden.

Dieses Beispiel zeigt auch, warum die Suche nach dem formatierten Ergebnis zu spät ist. Bei der Duplikaterkennung müssen die Mitgliedsnamen beim Lesen des ursprünglichen Token-Streams in jeder Objekttiefe berücksichtigt werden. Arrays benötigen keine Regel für doppelte Namen, obwohl separate Anwendungsregeln möglicherweise wiederholte Elementwerte berücksichtigen. Lassen Sie die Quelle unverändert, führen Sie einen duplikatsfähigen Parser oder Linter dafür aus und entscheiden Sie, ob es sich bei der Richtlinie um eine Warnung oder eine Ablehnung handelt.

Absichtliche Erkennung von Duplikaten

Verwenden Sie Tools, die explizit die Erkennung doppelter Namen in der Quelle JSON versprechen. Geeignete Ansätze umfassen einen Parser-Modus, der bei Wiederholungen fehlschlägt, einen Streaming-Token-Handler, der Namen für jedes geöffnete Objekt verfolgt, oder einen Linter mit einer dokumentierten Regel für doppelte Schlüssel. Überprüfen Sie verschachtelte Objekte und maskierte Namen: `"name"` und `"name"` dekodieren in denselben Mitgliedsnamen, auch wenn sich ihre Quellschreibweisen unterscheiden.

JSON Schema ist kein Ersatz, wenn bei der normalen Analyse frühere Vorkommnisse verworfen wurden. Ein Schemavalidator empfängt üblicherweise den konstruierten Wert und sieht eine Eigenschaft, nicht den Duplikat-Token-Verlauf. Führen Sie vor oder während der Analyse eine Eindeutigkeitsprüfung durch und wenden Sie dann Schemaprüfungen auf den eindeutigen Wert an. ToolAcre führt weder eine Duplikaterkennung noch eine Schemavalidierung durch, daher ist für beide ein separater, speziell entwickelter Schritt erforderlich.

Was dies nicht abdeckt

Wiederholte Objektnamen sind nicht dasselbe wie wiederholte Werte in allen Datensätzen. `[ {"id":7}, {"id":7} ]` enthält zwei separate Objekte mit jeweils einem `id`; Beim Erkennen einer doppelten Kennung gibt es eine Datensatzregel. Ebenso bleiben zwei Array-Elemente mit derselben Zeichenfolge zwei beabsichtigte Positionen, es sei denn, ein Anwendungsvertrag besagt, dass das Array eine Menge darstellt.

Dieser Artikel erhebt keinen Anspruch auf eine universelle First-Wins-, Last-Win- oder Ablehnungsrichtlinie für umfassende Sprachökosysteme. Es zeichnet das beobachtbare `JSON.parse`-Verhalten von ToolAcre auf und erklärt, warum eine andere Komponente direkt überprüft werden muss. Es bestimmt auch nicht die Ausnutzbarkeit anhand eines Duplikats allein. Auswirkungen auf die Sicherheit erfordern den Nachweis, dass unterschiedliche Interpretationen eine relevante Autorisierungs-, Routing- oder Validierungsgrenze überschreiten.

Takeaway: gültig JSON ist nicht immer eindeutig JSON

Ein ToolAcre Valid-Ergebnis bedeutet, dass die Token-Sequenz streng ist JSON; Dies bedeutet nicht, dass jeder Objektname eindeutig ist. `JSON.parse` behält den letzten Wert für einen wiederholten Namen und die Formatierung serialisiert nur diesen Überlebenden. Da das frühere Vorkommen gelöscht wird, ist die formatierte Ausgabe kein geeigneter Beweis für die Entscheidung, ob die Originalquelle Duplikate enthielt.

Wenn es auf Eindeutigkeit ankommt, überprüfen Sie den Originaltext vor dem normalen Parsen oder Formatieren mit Werkzeugen, die Duplikate erkennen. Wenden Sie anschließend die Schema- und Domänenvalidierung auf den resultierenden eindeutigen Wert an. Verfolgen Sie zur Sicherheitsüberprüfung den tatsächlichen Anforderungspfad und die Parser-Einstellungen, anstatt eine Meinungsverschiedenheit anzunehmen. Die praktische Regel ist einfach: Syntaxakzeptanz, Richtlinie für doppelte Namen und nachgelagerte Bedeutung sind separate Prüfungen mit separaten Beweisen.