Cet article présente principalement la méthode d'appel en toute sécurité des commandes système dans Node.js (pour éviter d'injecter des failles de sécurité). Ce chapitre explique généralement les problèmes de sécurité qui peuvent survenir lors de la connexion de chaînes. Les amis dans le besoin peuvent s'y référer.
Dans cet article, nous apprendrons comment utiliser correctement Node.js pour appeler des commandes système afin d'éviter les vulnérabilités courantes d'injection de ligne de commande.
La méthode que nous utilisons souvent pour appeler des commandes est la plus simple child_process.exec. Il a un modèle d'utilisation très simple : en passant une commande de chaîne et en renvoyant une erreur ou un résultat de traitement de commande à la fonction de rappel.
Voici un exemple très typique d'appel d'une commande système via child_process.exec.
child_process.exec('ls', function (err, data) { console.log(data); });
Cependant, que se passe-t-il lorsque vous devez ajouter des paramètres saisis par l'utilisateur à la commande que vous appelez ? La solution évidente consiste à fusionner l’entrée utilisateur directement avec votre commande. Cependant, mes années d’expérience me le disent : lorsque vous envoyez des chaînes connectées d’un système à un autre, quelque chose va mal se passer un jour.
var path = "user input"; child_process.exec('ls -l ' + path, function (err, data) { console.log(data); });
Pourquoi y a-t-il un problème avec la chaîne de connexion ?
Eh bien, parce que sous le moteur child_process.exec, "/bin/sh" sera appelé et exécuté. plutôt que le programme cible. La commande qui a été envoyée est simplement transmise à un nouveau processus '/bin/sh' pour exécuter le shell. Le nom child_process.exec est quelque peu trompeur - il s'agit d'un interpréteur bash qui ne démarre pas de programme. Cela signifie que tous les caractères du shell peuvent le faire. avoir des conséquences dévastatrices si les paramètres saisis par l'utilisateur sont exécutés directement
[pid 25170] execve("/bin/sh", ["/bin/sh", "-c", "ls -l user input"], [/* 16 vars */]
Par exemple, un attaquant peut utiliser un point-virgule ";" pour terminer une commande et en démarrer une nouvelle. Appelé, il peut utiliser des backticks ou $. () pour exécuter des sous-commandes.
Alors, quelle est la bonne façon d'appeler execFile/spawn< ? 🎜>
Comme spawn et execFile, prenez un paramètre de tableau supplémentaire, qui n'est pas un paramètre qui peut être utilisé. exécutez d'autres commandes dans un environnement shell et n'exécutera pas de commandes supplémentaires. Utilisons execFile. Modifions l'exemple précédent avec spawn pour voir en quoi l'appel système est différent et pourquoi il n'est pas vulnérable à l'injection de commandes. L'appel système
child_process.spawn
est très similaire à l'exemple utilisant le remplacement par spawn de l'appel système exécutant
. 🎜>var child_process = require('child_process'); var path = "." child_process.execFile('/bin/ls', ['-l', path], function (err, result) { console.log(result) });
[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]
Évitez d'utiliser child_process.exec, en particulier lorsque vous devez inclure des paramètres saisis par l'utilisateur, veuillez garder cela à l'esprit. Il est préférable de laisser l'utilisateur transmettre les paramètres, en utilisant des options plutôt que de lui demander de saisir. une chaîne directement Si vous devez autoriser l'utilisateur à saisir des paramètres, consultez attentivement les paramètres de la commande pour déterminer quelles options sont sûres et établissez une liste blanche
Ce qui précède est l'intégralité du contenu de cette liste. Pour plus de didacticiels connexes, veuillez visiter leTutoriel vidéo Node.js
!