Maison  >  Article  >  interface Web  >  Comment appeler en toute sécurité des commandes système dans Node.js (pour éviter d'injecter des vulnérabilités de sécurité)

Comment appeler en toute sécurité des commandes système dans Node.js (pour éviter d'injecter des vulnérabilités de sécurité)

PHPz
PHPzoriginal
2016-05-16 16:29:071579parcourir

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)
});
Lors de l'utilisation de spawn ou execfile, le but est d'exécuter une seule commande (paramètres). Cela signifie que l'utilisateur ne peut pas exécuter la commande injectée car /bin/ls ne sait pas comment gérer les backticks ou les pipes ; . Ce que /bin/bash fera, c'est interpréter les paramètres de ces commandes. C'est similaire à l'utilisation de

si vous le connaissez, mais avec la mise en garde : utiliser spawn ou execFile n'est pas toujours sûr. exécuter /bin/find et transmettre les paramètres d'entrée de l'utilisateur peut toujours compromettre le système. La commande find comporte certaines options qui permettent de lire/écrire des fichiers arbitraires. 🎜> Voici donc quelques directives pour exécuter des commandes système dans Node.js. :
[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 le

Tutoriel vidéo Node.js

 !
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn