Dentro de uma linguagem de programação, eu executo um comando shell simples
cd var; echo > create_a_file_here
com var sendo uma variável que contém uma string de (espero) um diretório para o local onde eu quero criar o arquivo "create_a_file_here". Agora, se alguém vir esta linha de código, é possível explorá-la atribuindo, por exemplo:
var = "; rm -rf /"
As coisas podem ficar bem feias. Uma maneira de evitar o caso acima seria talvez pesquisar na string var vários caracteres especiais como ';' antes de executar o comando shell, mas duvido que isso abranja todas as explorações possíveis.
Alguém sabe uma boa maneira de garantir que "cd var" mude apenas um diretório e nada mais?
sh
ou criando sua própria linguagem de programação com uma sintaxe semelhante, mas que se expande em var
vez de exigir que você escreva cd "$var"
? Ou isso é bash
com shopt -s cdable_vars
? Ah, acho que você quer dizer que outro programa bifurca um shell para executar esses comandos. Então, basta citar var
, mas certifique-se que não inclui em si um caracter de aspas ...
s='"'; echo "$s"
impressões "
.
var=untrusted string
no programa pai, também var
é uma variável de ambiente que já está definida ao chamar sh
. Então, você só precisa citá-lo toda vez que o expandir, o que é possível de forma confiável. Ah, vejo que idéia já é parte da resposta de Stéphane> <.
var
como argumento. Por exemplo, chamandosh
com argumentos-c
,'cd "$1"; echo > create_a_file_here'
,'sh'
,var
obras e não precisa de qualquer alteraçãovar
. O'sh'
argumento é passado como$0
.