Wie sollte ich JSON mit Node.js parsen? Gibt es ein Modul, das JSON sicher validieren und parsen kann?
Antworten
Zu viele Anzeigen?Jeder hier hat über JSON.parse berichtet, also dachte ich, ich könnte etwas anderes sagen. Es gibt ein großartiges Modul Verbinden Sie mit zahlreicher Middleware, um die Entwicklung von Anwendungen einfacher und besser zu machen. Eine der Middlewares ist bodyParser . Sie parst JSON, HTML-Formulare usw. Es gibt auch eine spezielle Middleware nur für JSON-Parsing noop .
Schauen Sie sich die obigen Links an, sie könnten sehr hilfreich für Sie sein.
Wie andere Antworten hier erwähnt haben, möchten Sie wahrscheinlich entweder eine lokale json-Datei erfordern, die Sie wissen, ist sicher und vorhanden, wie eine Konfigurationsdatei:
var objectFromRequire = require('path/to/my/config.json');
oder das globale JSON-Objekt zu verwenden, um einen String-Wert in ein Objekt zu parsen:
var stringContainingJson = '\"json that is obtained from somewhere\"';
var objectFromParse = JSON.parse(stringContainingJson);
Beachten Sie, dass bei der Anforderung einer Datei der Inhalt dieser Datei ausgewertet wird, was ein Sicherheitsrisiko darstellt, wenn es sich nicht um eine json-Datei, sondern um eine js-Datei handelt.
Hier habe ich eine Demo veröffentlicht, in der Sie beide Methoden sehen und online ausprobieren können (das Parsing-Beispiel befindet sich in der app.js-Datei - klicken Sie dann auf die Schaltfläche "Ausführen" und sehen Sie das Ergebnis im Terminal): http://staging1.codefresh.io/labs/api/env/json-parse-example
Sie können den Code ändern und die Auswirkungen sehen...
Wenn Sie JSON mit Node.js auf eine sichere Art und Weise parsen müssen (aka: der Benutzer kann Daten eingeben, oder eine öffentliche API), würde ich die Verwendung von secure-json-parse .
Die Verwendung ist wie die Standard JSON.parse
aber es wird Ihren Code vor schützen:
- Prototyp-Vergiftung
-
const badJson = '{ "a": 5, "b": 6, "proto": { "x": 7 }, "constructor": {"prototype": {"bar": "baz"} } }'
const infected = JSON.parse(badJson) console.log(infected.x) // print undefined
const x = Object.assign({}, infected) console.log(x.x) // print 7
const sjson = require('secure-json-parse') console.log(sjson.parse(badJson)) // it will throw by default, you can ignore malicious data also
Verwenden Sie JSON für Ihre Konfiguration mit Node.js? Lesen Sie dies und erhalten Sie Ihre Konfiguration Fähigkeiten über 9000...
Hinweis: Die Behauptung, data = require('./data.json'); sei ein ein Sicherheitsrisiko darstellt und die Antworten anderer mit eifrigem Eifer herunterstuft: Sie sind genau und vollständig falsch . Versuchen Sie, Nicht-JSON in dieser Datei zu platzieren... Node wird Ihnen einen Fehler anzeigen, genau wie wenn Sie das Gleiche mit der viel langsamer und schwieriger zu kodieren, um die Datei manuell zu lesen und anschließend JSON.parse(). Bitte hören Sie auf, Fehlinformationen zu verbreiten; Sie schaden der Welt, statt ihr zu helfen. Node war entworfen um dies zu ermöglichen; es ist kein Sicherheitsrisiko!
Richtige Anwendungen gibt es in 3+ Schichten der Konfiguration:
- Server/Container-Konfiguration
- Anwendungskonfiguration
- (optional) Mieter/Gemeinschaft/Organisation konfigurieren
- Benutzer-Konfiguration
Die meisten Entwickler behandeln ihre Server- und Anwendungskonfiguration so, als ob sie sich ändern könnte. Das kann sie aber nicht. Sie können Ebenenwechsel von höheren Schichten übereinander, aber Sie sind Änderung der Grundanforderungen . Einige Dinge brauchen zu existieren! Lassen Sie Ihre Konfiguration so tun, als sei sie unveränderlich, denn ein Teil davon ist es im Grunde auch, genau wie Ihr Quellcode.
Wenn man nicht erkennt, dass sich viele Dinge nach dem Start nicht mehr ändern, führt das zu Anti-Patterns, wie z.B. das Überladen der Konfiguration mit try/catch-Blöcken, und man tut so, als könne man fortfahren ohne Ihre ordnungsgemäß eingerichtete Anwendung. Das können Sie nicht. Wenn Sie es können, gehört das in die Community-/Benutzerkonfigurationsebene, nicht in die Server-/Anwendungskonfigurationsebene. Sie machen es einfach falsch. Das optionale Zeug sollte obenauf geschichtet werden, wenn die Anwendung ihren Bootstrap beendet hat.
Hören Sie auf, Ihren Kopf gegen die Wand zu schlagen: Ihre Konfiguration sollte sein sehr einfach .
Schauen Sie sich an, wie einfach es ist, etwas so Komplexes wie ein protokoll- und datenquellenunabhängiges Service-Framework mit einer einfachen json-Konfigurationsdatei und einer einfachen app.js-Datei einzurichten...
container-config.js...
{
"service": {
"type" : "http",
"name" : "login",
"port" : 8085
},
"data": {
"type" : "mysql",
"host" : "localhost",
"user" : "notRoot",
"pass" : "oober1337",
"name" : "connect"
}
}
index.js... (der Motor, der alles antreibt)
var config = require('./container-config.json'); // Get our service configuration.
var data = require(config.data.type); // Load our data source plugin ('npm install mysql' for mysql).
var service = require(config.service.type); // Load our service plugin ('http' is built-in to node).
var processor = require('./app.js'); // Load our processor (the code you write).
var connection = data.createConnection({ host: config.data.host, user: config.data.user, password: config.data.pass, database: config.data.name });
var server = service.createServer(processor);
connection.connect();
server.listen(config.service.port, function() { console.log("%s service listening on port %s", config.service.type, config.service.port); });
app.js... (der Code, der Ihren protokollunabhängigen und datenquellenunabhängigen Dienst betreibt)
module.exports = function(request, response){
response.end('Responding to: ' + request.url);
}
Mit diesem Muster können Sie nun Community- und Benutzerkonfigurationsdaten auf Ihre gebootete Anwendung laden, und Dev Ops ist bereit, Ihre Arbeit in einen Container zu schieben und zu skalieren. Sie sind bereit für Multitenant. Userland ist isoliert. Sie können sich nun nicht mehr darum kümmern, welches Serviceprotokoll Sie verwenden, welchen Datenbanktyp Sie nutzen und sich einfach darauf konzentrieren, guten Code zu schreiben.
Da Sie Schichten verwenden, können Sie sich jederzeit auf eine einzige Quelle der Wahrheit verlassen (das geschichtete Konfigurationsobjekt) und vermeiden Fehlerprüfungen bei jedem Schritt und die Sorge "Oh, Mist, wie soll ich das jetzt machen? ce ohne ordnungsgemäße Konfiguration funktionieren?!?".
Nur wollen die Antwort zu vervollständigen (wie ich kämpfte mit ihm für eine Weile), wollen zeigen, wie die Json-Informationen zugreifen, zeigt dieses Beispiel Zugriff auf Json Array:
var request = require('request');
request('https://server/run?oper=get_groups_joined_by_user_id&user_id=5111298845048832', function (error, response, body) {
if (!error && response.statusCode == 200) {
var jsonArr = JSON.parse(body);
console.log(jsonArr);
console.log("group id:" + jsonArr[0].id);
}
})