Node.js: So kannst du deine Applikation schützen
Gergely Nemeth hat in seinem Blog einige gute Hinweise geliefert, wie ihr die Sicherheit euerer Applikationen erhöhen könnt. In diesem Artikel zeigen wir euch einen Auszug.
Node.js und Eval
Wer seinen Code vor „Injections“ schützen möchte, sollte auf eval
verzichten. Gerade wenn ihr eval
für Benutzereingaben benutzt, tritt diese Lücke auf. Außerdem verlangsamt eval
den Interpreter.
Node.js: Bitte im Strict mode
Mit dem Flag 'use strict';
könnt ihr unischtbare Fehler sichtbar machen und ihr werdet auf diese auch aufmerksam gemacht. Einige Beispiele:
Undeletable properties
"use strict";
delete Object.prototype; // TypeError
Objekt-Literale müssen unique sein
"use strict";
var obj = {
a: 1,
a: 2
};
// syntax error
Ihr könnt eine vollständige Liste dieser „unsichtbaren Fehler“ bei Mozilla einsehen.
Code-Analyse mit Lint
Egal ob ihr JSLint, JSHint oder ESLint nutzt: Statische Codeanalysen helfen euch dabei viele Fehler bereits während des Schreibens zu entdecken.
Testen, Testen, Testen
Kaum jemand möchte seinen Code auch intensiv testen – sei es aus „Kostengründen“ oder weil ihr einfach ungern Unit-Tests schreibt. Tests sind aber eine Notwendigkeit und sollten daher durchgeführt werden, um zu gewährleisten, dass die App auch wirklich das tut, was in der Anforderungsanalyse festgelegt wurde. Natürlich sind Unit-Tests alleine nicht das einzige mittel, aber: Kennt ihr eigentlich die Test-Pyramide?
sudo node app.js
ist böse
Der Applikation alle Rechte zu geben ist nicht in Ordnung, nur damit die App die Möglichkeit hat, an den Ports 80 und 443 zu lauschen. Statt dessen solltet ihr einen HTTP-Proxy aufsetzen, der die Anfragen durchleitet – dabei ist egal ob nginx oder Apache.
Command Injections verhindern
child_process.exec('ls', function (err, data) {
console.log(data);
});
Im Hintergrund wird bei child-process.exec
nämlich /bin/sh
ausgeführt. Somit ist es ein bash
-Interpreter und kein Launcher. Problematisch wird dieser Umstand, wenn Benutzereingaben durch diese Methode wandern, die dann wiederum schädlichen Code ausführen könnten.
Ein Einfacher Fix dazu ist die Verwendung von child_process.execFile
Mehr zu Command Injections gib es hier.
Mehr zu Node.js-Sicherheit und weiteren Beispielen findet ihr hier und beim „Node.js Security Project“.
Ebenfalls interessant:
sudeo node app.js ist böse => sudo node app.js ist böse
Tippfehler im Artikel: Es sollte sudo statt sudeo heißen :)
@Daniel @xomz Danke für den Hinweis :)
Fehlerteufel: Mit dem Flag ‚use strict‘; könnt ihr !!! unischtbare!!! Fehler sichtbar machen …