Heim > Web-Frontend > js-Tutorial > So rufen Sie Systembefehle in Node.js sicher auf (um das Einschleusen von Sicherheitslücken zu vermeiden)

So rufen Sie Systembefehle in Node.js sicher auf (um das Einschleusen von Sicherheitslücken zu vermeiden)

PHPz
Freigeben: 2018-09-30 10:53:37
Original
1609 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich die Methode zum sicheren Aufrufen von Systembefehlen in Node.js vorgestellt (um das Einschleusen von Sicherheitslücken zu vermeiden). In diesem Kapitel werden allgemein die Sicherheitsprobleme erläutert, die beim Verbinden von Zeichenfolgen auftreten können.

In diesem Artikel erfahren Sie, wie Sie Node.js korrekt zum Aufrufen von Systembefehlen verwenden, um häufige Schwachstellen bei der Befehlszeileninjektion zu vermeiden.

Die Methode, die wir häufig zum Aufrufen von Befehlen verwenden, ist die einfachste child_process.exec. Es verfügt über ein sehr einfaches Verwendungsmuster; durch die Übergabe eines Zeichenfolgenbefehls und die Rückübergabe eines Fehlers oder eines Befehlsverarbeitungsergebnisses an die Rückruffunktion.

Hier ist ein sehr typisches Beispiel für den Aufruf eines Systembefehls über child_process.exec.

child_process.exec('ls', function (err, data) {
    console.log(data);
});
Nach dem Login kopieren

Was passiert jedoch, wenn Sie dem von Ihnen aufgerufenen Befehl einige vom Benutzer eingegebene Parameter hinzufügen müssen? Die offensichtliche Lösung besteht darin, die Benutzereingaben direkt mit Ihrem Befehl zusammenzuführen. Meine jahrelange Erfahrung sagt mir jedoch: Wenn man verbundene Strings von einem System zum anderen schickt, wird eines Tages etwas schief gehen.

var path = "user input";
child_process.exec('ls -l ' + path, function (err, data) {
    console.log(data);
});
Nach dem Login kopieren

Warum gibt es ein Problem mit der Verbindungszeichenfolge?

Nun, denn unter der child_process.exec-Engine wird „/bin/sh“ aufgerufen und ausgeführt. und nicht das Zielprogramm. Der gesendete Befehl wird einfach an einen neuen „/bin/sh“-Prozess übergeben, um die Shell auszuführen. Der Name child_process.exec ist etwas irreführend – es handelt sich um einen Bash-Interpreter, der kein Programm startet verheerende Folgen haben, wenn vom Benutzer eingegebene Parameter direkt ausgeführt werden

[pid 25170] execve("/bin/sh", ["/bin/sh", "-c", "ls -l user input"], [/* 16 vars */]
Nach dem Login kopieren

Ein Angreifer kann beispielsweise ein Semikolon „;“ verwenden, um einen Befehl zu beenden und einen neuen zu starten. Er kann Backticks oder $ verwenden () um Unterbefehle auszuführen.

Was ist also der richtige Weg, um execFile/spawn aufzurufen? Führen Sie andere Befehle in einer Shell-Umgebung aus und führen Sie keine zusätzlichen Befehle aus.

Verwenden Sie execFile, um zu sehen, wie sich der Systemaufruf unterscheidet und warum er nicht anfällig für Befehlsinjektion ist. Der Systemaufruf

child_process.spawn

ist dem Beispiel mit Spawn-Ersetzung des Systemaufrufs

, der ausführt, sehr ähnlich 🎜>Bei Verwendung von spawn oder execfile besteht das Ziel darin, nur einen Befehl (Parameter) auszuführen. Dies bedeutet, dass der Benutzer den injizierten Befehl nicht ausführen kann, da /bin/ls nicht weiß, wie er mit Backticks oder Pipes umgehen soll. . Was /bin/bash tun wird, ist die Verwendung von

var child_process = require('child_process');

var path = "."
child_process.execFile('/bin/ls', ['-l', path], function (err, result) {
    console.log(result)
});
Nach dem Login kopieren
, wenn Sie damit vertraut sind: Die Verwendung von spawn oder execFile ist beispielsweise nicht immer sicher. Das Ausführen von /bin/find und das Übergeben von Benutzereingabeparametern kann immer noch dazu führen, dass das System gefährdet wird. Der Befehl „find“ verfügt über einige Optionen, die das Lesen/Schreiben beliebiger Dateien ermöglichen 🎜>Hier sind einige Richtlinien für die Ausführung von Systembefehlen in Node.js :

Vermeiden Sie die Verwendung von child_process.exec, insbesondere wenn Sie vom Benutzer eingegebene Parameter einschließen müssen. Bitte beachten Sie dies. Es ist viel besser, den Benutzer Parameter übergeben zu lassen und Optionen zu verwenden, als den Benutzer zur Eingabe aufzufordern eine Zeichenfolge direkt
[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]
Nach dem Login kopieren
Wenn Sie dem Benutzer erlauben müssen, Parameter einzugeben, prüfen Sie ausführlich die Parameter des Befehls, um festzustellen, welche Optionen sicher sind, und erstellen Sie eine Whitelist.

Das Obige ist der gesamte Inhalt Weitere verwandte Tutorials finden Sie im Node.js-Video-Tutorial

!
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage