105 Stimmen

Ist es zulässig, Funktionen in JSON-Ergebnissen zu definieren?

Ein Teil der JSON-Antwort einer Website enthielt Folgendes (... aus Gründen des Kontexts hinzugefügt):

{..., now:function(){return(new Date).getTime()}, ...}

Ist das Hinzufügen anonymer Funktionen zu JSON gültig? Ich würde erwarten, dass jedes Mal, wenn Sie auf "Zeit" zugreifen, einen anderen Wert zurückgeben.

111voto

Mike Punkte 22052

Nein.

JSON ist als reine Datenbeschreibungssprache gedacht. Wie bereits auf http://www.json.org ist es ein "leichtgewichtiges Datenaustauschformat". - keine Programmiersprache.

Per http://en.wikipedia.org/wiki/JSON Die unterstützten "Grundtypen" sind:

  • Zahl (Integer, Real oder Floating) Punkt)
  • Zeichenkette (Unicode in Anführungszeichen mit Backslash-Escaping)
  • Boolesche (wahr und falsch)
  • Array (eine geordnete Folge von Werten, kommagetrennt und in eckige Klammern eingeschlossen)
  • Objekt (Sammlung von Schlüssel:Wert Paaren, durch Komma getrennt und in geschweifte Klammern in geschweiften Klammern)
  • null

16voto

harschware Punkte 12227

Das Problem ist, dass JSON als Datendefinitionssprache aus JSON als JavaScript Object Notation hervorgegangen ist. Da Javascript eval auf JSON unterstützt, ist es legitim, JSON-Code in JSON zu setzen (in diesem Anwendungsfall). Wenn Sie JSON verwenden, um Daten aus der Ferne zu übermitteln, dann würde ich sagen, dass es eine schlechte Praxis ist, Methoden in JSON einzufügen, weil Sie Ihre Client-Server-Interaktion möglicherweise nicht gut modelliert haben. Wenn Sie JSON als Datenbeschreibungssprache verwenden möchten, würde ich außerdem sagen, dass Sie sich durch die Einbettung von Methoden in Schwierigkeiten bringen könnten, da einige JSON-Parser nur für die Datenbeschreibung geschrieben wurden und möglicherweise keine Methodendefinitionen in der Struktur unterstützen.

Wikipedia JSON-Eintrag ist ein gutes Argument dafür, Methoden nicht in JSON aufzunehmen, und führt Sicherheitsbedenken an:

Wenn Sie der Quelle des Textes nicht absolut vertrauen und Sie einen Text parsen und akzeptieren müssen, der nicht streng JSON-konform ist, sollten Sie eval() vermeiden und stattdessen JSON.parse() oder einen anderen JSON-spezifischen Parser verwenden. Ein JSON-Parser erkennt nur JSON-Text und lehnt anderen Text ab, der böswilliges JavaScript enthalten könnte. In Browsern, die native JSON-Unterstützung bieten, sind JSON-Parser auch viel schneller als eval. Es wird erwartet, dass die native JSON-Unterstützung in den nächsten ECMAScript-Standard aufgenommen wird.

12voto

Jens A. Koch Punkte 37009

Zitieren wir eine der Spezifikationen - https://www.rfc-editor.org/rfc/rfc7159#section-12

El Die Spezifikation des Datenaustauschformats JavaScript Object Notation (JSON) Staaten:

JSON ist eine Teilmenge von JavaScript, schließt aber Zuweisung und Aufruf aus.

Da die JSON-Syntax von JavaScript entlehnt ist, ist es möglich, die die Funktion "eval()" dieser Sprache zum Parsen von JSON-Texten zu verwenden. Diese stellt im Allgemeinen eine inakzeptables Sicherheitsrisiko, da der Text
könnte ausführbaren Code zusammen mit Datendeklarationen enthalten
. Die gleiche Überlegung gilt für die Verwendung von eval()-ähnlichen Funktionen in jeder anderen Programmiersprachen, in denen JSON-Texte dieser Sprache entsprechen
der Syntax der Sprache.

Alle Antworten, die besagen, dass Funktionen nicht Teil des JSON-Standards sind, sind also richtig.

Die offizielle Antwort lautet: Nein, es ist nicht zulässig, Funktionen in JSON-Ergebnissen zu definieren!


Die Antwort könnte ja lauten, denn "Code ist Daten" und "Daten sind Code". Selbst wenn JSON als sprachunabhängiges Daten-Serialisierungsformat verwendet wird, funktioniert ein Tunneling von "Code" durch andere Typen.

Ein JSON-String kann verwendet werden, um eine JS-Funktion zur Ausführung an den clientseitigen Browser zu übergeben.

[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]

Dies führt zu Fragen wie: Wie kann man "https://stackoverflow.com/questions/939326/execute-javascript-code-stored-as-a-string" erreichen.

Seien Sie darauf vorbereitet, Ihre "eval() ist böse"-Flagge zu hissen und Ihre "tunneln Sie keine Funktionen durch JSON"-Flagge daneben zu stecken.

8voto

jldupont Punkte 87330

Soweit ich weiß, ist das nicht üblich. Ein kurzer Blick auf http://json.org/ bestätigt dies.

5voto

jvenema Punkte 43201

Nein, definitiv nicht.

Wenn Sie einen anständigen JSON-Serialisierer verwenden, wird er Sie eine solche Funktion nicht serialisieren lassen. Es ist ein gültiges OBJECT, aber kein gültiges JSON. Was auch immer die Absicht dieser Website ist, sie sendet kein gültiges JSON.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X