In esecuzione perl
one-liner dalla riga di comando ha security implications.Possiamo forzare sempre perl utilizzare sempre tre argomenti aperti durante l'esecuzione dalla riga di comando?
Il problema è che le opzioni -n/-p
innescare l'operatore diamante <>
, che utilizzano due argomenti sotto forma di open
, quindi con il nome di file contenenti caratteri speciali, perl
non funziona come previsto:
$ perl -pe '' 'uname|'
Linux
O più pericoloso quando il nome del file inizia con >
, ad esempio >file
. In questo caso, il file verrà troncato.
Per aggirare questo problema, siamo in grado di:
- modulo Usa ARGV::readonly da CPAN.
- Implementare funzionalità come modulo
ARGV::readonly
da noi stessi:
perl -pe 'BEGIN{$_.="\0" for @ARGV} ...' ./*
- opzione Usa
-i
, comeperl
verifica la presenza di file di esisteva prima di elaborarlo. - Utilizzare l'opzione
-T
per attivare la modalità di contaminazione.
Penso che tutte le soluzioni possano risolvere questo problema, ma hanno anche i loro effetti collaterali. Se siamo in grado di forzare perl
utilizzare sempre il modulo di argomento di open
, sarà una soluzione migliore.
Mi chiedo, lo possiamo fare, forza perl
utilizzare sempre il modulo di argomento open
?
Nota
La questione si applicano solo per il caso in cui l'esecuzione perl
uno liners da linea di comando, perché (ovviamente) si può sempre usare tre formano argomento di open
in script Perl.
capisco il tuo punto, ma non vedo come l'output di 'perl -pe '' 'uname |'' non è quello che la gente si aspetta, e avrei pensato che il pericolo maggiore è 'perl -pe" 1 ""> myfile "'. Penso che tutti i file di input da riga di comando dovrebbero essere aperti usando la forma a tre parametri con il secondo parametro sempre impostato su '<'. – Borodin
@Borodin: ''uname |'' è un nome file valido, invece di aprirlo, il comando 'uname' viene eseguito e collegato a' perl'. E immaginiamo che il comando possa essere 'rm -rf $ HOME'. Sì, tranne per l'opzione '-i', quando si desidera modificare il file sul posto. Puoi leggere il link che ho fornito nella mia domanda per maggiori dettagli. – cuonglm