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.