Questa non è affatto l'iniezione SQL; non stai passando $theVar
a un server SQL, ma a un comando shell. Pertanto, mysql_real_escape_string
è inutile.
Devi utilizzare escapeshellarg
, che applica lo stesso concetto a una stringa di shell.
In questo esempio,
$theVar = preg_replace("/[\"'%()@$.!&?_: #\/-]/","", mysql_real_escape_string($_GET['var']));
exec("zip -r archived.zip ./".$theVar."/");
non stai sfuggendo ai caratteri di reindirizzamento < e & gt ;. Quindi (per esempio) è possibile sovrascrivere qualsiasi file a cui il processo che esegue zip
ha accesso.
Peggio ancora, non stai sfuggendo al carattere del separatore del comando; . Quindi è possibile aggiungere comandi aggiuntivi (a patto che non utilizzino nessuno dei caratteri vietati) che verrà eseguito anche.
Un approccio migliore sarebbe vedere quali caratteri sono permessi in un nome file e accettare solo quelli, rifiutando qualsiasi stringa contenente caratteri proibiti. Se autorizzi i caratteri jolly (come te), espandi quelli stessi con glob()
per ottenere un elenco di file e controlla quei file per le autorizzazioni e la posizione traducendo ciascun percorso in un percorso univoco canonico utilizzando realpath()
.
Meglio ancora, non permettere i caratteri jolly. A quel punto sarebbe anche facile verificare se il file richiesto esiste effettivamente. I comandi della shell risulterebbero per lo più invalidi o inesistenti come nomi di file e saranno automaticamente rifiutati senza costi aggiuntivi.