json2.js ist streng vorgeschrieben, alle Objektschlüssel müssen doppelt zitiert werden. In Javascript-Syntax entspricht {"foo":"bar"}
jedoch {foo:"bar"}
.Sicheres Parsen einer JSON-Zeichenfolge mit nicht in Anführungszeichen gesetzten Schlüsseln
Ich habe eine Textarea, die JSON-Eingabe vom Benutzer akzeptiert und möchte die Einschränkung auf doppelte Anführungszeichen der Schlüssel "erleichtern". Ich habe mir angeschaut, wie json2.js eine JSON-Zeichenkette in vier Stufen validiert, bevor sie diese interpretiert. Ich war in der Lage, eine fünfte Stufe hinzuzufügen, um nicht aufgezählte Schlüssel zuzulassen, und würde gerne wissen, ob es Sicherheitseinflüsse auf diese Logik gibt.
var data = '{name:"hello", age:"23"}';
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
.replace(/(?:^|:|,)(?:\s*\[)+/g, ":") // EDITED: allow key:[array] by replacing with safe char ":"
/** everything up to this point is json2.js **/
/** this is the 5th stage where it accepts unquoted keys **/
.replace(/\w+\s*\:/g, ":"))) { // EDITED: allow any alphanumeric key
console.log((new Function("return " + data))());
}
else {
throw("Invalid JSON: " + data);
}
Sie übernehmen eine wörtliche JavaScript Object zu JSON äquivalent ist, das es nicht ist. – Stephen
'{name:" Joe "}' ist gültiges Javascript, aber es ist _invalid_ JSON. Außerdem möchten Sie nicht 'json2.js' hacken, weil es nur spiegelt, wie die native JSON-Unterstützung von Browsern funktioniert. In Chrome zum Beispiel würde 'JSON.parse()' ohne 'json2.js' auch daran ersticken. Aber schlimmer ist, dass 'json2.js' nichts lädt, wenn der Browser native JSON-Unterstützung hat. Sie werden also in einer Situation sein, in der Browser mit nativem JSON-Support diesen Hack niemals sehen, weil er stattdessen nativen Code verwendet, um ihn zu analysieren. –
@Stephen Sie haben Recht. Vielleicht sollte ich die Frage wie "JavaScript-Objekt-Literal sicher analysieren und in JSON konvertieren" umformulieren? – daepark