Como lidar com a insegurança de 'eval' avaliar entrada externa em um script?

4

Binaryzebra disse

this script is evaluating external input, a highly insecure practice.

Quais são algumas maneiras de lidar ou mesmo substituir eval avaliando entradas externas em um script?

Obrigado.

    
por Tim 19.07.2016 / 13:45

1 resposta

7

Apenas certifique-se de que os argumentos passados para eval não sejam provenientes de entradas externas ou que, se forem, você os tenha higienizado antes.

Como em, não faça:

n=0
....
n=((n + 1))
eval "var$n=$1"

$n está sob controle, o conteúdo de $1 não é. Se $1 for foo;reboot , por exemplo, o eval receberá o código var3=foo;reboot para interpretar e que será reinicializado.

Uso:

eval "var$n=\"

Então, em vez disso, eval receberá var3=$1 , o que é bom.

eval "$1=\"

Seria errado também. Você precisa garantir que o conteúdo de $1 seja apenas de um conjunto de valores aceitos (saneantes):

unset var1 foo bar
case $1 in
  (var1 | foo | bar) eval "$1=\";;
  (*) echo >&2 unexpected variable name; exit 1;;
esac

Observe que eval não é o único comando que avalia o código arbitrário, há muitos outros como sh , perl , awk , sed , até read , export , typeset , printf , test ou [ em algumas shells, você precisa ser igualmente cuidadoso com elas ao passar a entrada externa como argumentos.

    
por 19.07.2016 / 13:56