All'interno di un linguaggio di programmazione, eseguo un semplice comando shell
cd var; echo > create_a_file_here
con var che è una variabile che contiene una stringa di (si spera) una directory nel punto in cui voglio creare il file "create_a_file_here". Ora se qualcuno vede questa riga di codice, è possibile sfruttarla assegnando ad esempio:
var = "; rm -rf /"
Le cose possono diventare piuttosto brutte. Un modo per evitare il caso precedente potrebbe essere quello di cercare nella stringa in var alcuni caratteri speciali come ';' prima di eseguire il comando shell, ma dubito che questo copra tutti i possibili exploit.
Qualcuno conosce un buon modo per assicurarsi che "cd var" cambi solo una directory e nient'altro?
sh
o stai creando il tuo linguaggio di programmazione con una sintassi simile ma che si espande var
invece di richiedere la scrittura cd "$var"
? O è questo bash
con shopt -s cdable_vars
? Oh, penso che intendi dire che qualche altro programma crea una shell per eseguire questi comandi. Quindi cita var
, ma assicurati che non includa un carattere di citazione stesso ...
s='"'; echo "$s"
stampe "
.
var=untrusted string
nel programma genitore, quindi var
è una variabile d'ambiente che è già impostata quando si richiama sh
. Quindi devi solo citarlo ogni volta che lo espandi, il che è possibile fare in modo affidabile. Ah, vedo che l'idea fa già parte della risposta di Stéphane>. <
var
come argomento. Ad esempio, chiamandosh
con argomenti-c
,'cd "$1"; echo > create_a_file_here'
,'sh'
,var
opere e non ha bisogno di alcuna modificavar
. L''sh'
argomento è passato come$0
.