Domanda

Ho il seguente codice, ma sto pensando che ho bisogno di disinfettare le variabili env, ma non sono sicuro di come esattamente io li disinfettare. Mi rendo conto che probabilmente c'è un limite a quanto io possa disinfettare, ma cosa posso fare?

#!/usr/bin/perl
use 5.012;
use warnings;
use autodie;
use Env qw( EDITOR VISUAL );
use File::Temp qw( :seekable );

my $editor = '/usr/bin/nano';
if ( $VISUAL ) {
    $editor = $VISUAL;
}
elsif ( $EDITOR ) {
    $editor = $EDITOR;
} else {
    warn 'set VISUAL and EDITOR env variables not set falling back to nano'
    . "\n";
}

my $tmpf = File::Temp->new;

system $editor, $tmpf->filename;

open $tmpf, '<', $tmpf->filename;

print while ( <$tmpf> );
È stato utile?

Soluzione

Ho solo mai fatto qualcosa di simile in script CGI, quindi forse questo non è affatto quello che stai cercando; Spero solo che vi aiuterà un po '. Ecco una versione modificata della selezione di caratteri consentiti ho usato, e un suggerimento di codice:

   my $editor = '/usr/bin/nano';
   my $allowed = 'a-zA-Z0-9.\-_/';

   # this is what I did, but you will probably not want to do this... 
   #$file =~ s/[^$allowed]//go; # Remove every character thats NOT in the OK-list

   # check that the variables contain only allowed characters
   if ($VISUAL =~ m/^[$allowed]+$/) {
      $editor = $VISUAL;
   }
   elsif ($EDITOR =~ m/^[$allowed]+$/) {
      $editor = $EDITOR;
   } 
   else {
      # message
   }

   # The code I have given above should also leave $editor in its default
   # state if neither $VISUAL nor $EDITOR has been set, as the condition
   # will not be true for empty strings/undef values.

Ovviamente, non è possibile modificare le variabili di ambiente se si notano i caratteri in esse che si pensa non dovrebbe essere lì (cioè caratteri che non sono nella stringa di permesso $), ma si potrebbe verificare la presenza di tali personaggi e caduta indietro sul vostro editor di default in un caso del genere. Questo è solo il mio modesto suggerimento; forse un esperto sul tema risponderà in un po ', e si otterrà il suo / la sua saggezza servito su un piatto d'argento:)

Altri suggerimenti

Perché avete bisogno di sterilizzare loro a tutti? Quali danni sta per verificarsi se l'utente del vostro script ha VISUAL="rm -f" e EDITOR a qualcos'altro bizzarro? Si potrebbe essere il controllo che l'operazione è riuscita editor di, e che il file è stato aperto, e che il suo contenuto avevano un senso, dopo la modifica, prima di te qualcosa di pericoloso. Ma se l'utente è solo in grado di danneggiare i propri file (non si esegue un sistema in cui si possono danneggiare i file, vero?), Allora non c'è molto bisogno di loro sanificazione. Fornire un valore di default è ragionevole; circostanze locali dettano se nano è una scelta migliore rispetto, ad esempio, vim.

Se l'utente non può danneggiare la tua roba abusando VISUAL e EDITOR, quindi vorrei non preoccupatevi troppo su di loro la scelta di danneggiare le proprie cose.

Se si sta scrivendo qualcosa che verrà eseguito con i privilegi di rilievo - con setuid o setgid privilegi, per esempio - allora si deve preoccupare molto di più su di esso. (Il codice Perl manca controlli che sono più fondamentale che preoccuparsi l'editor per l'uso. Oh, ma che use autodie; mezzo dello script interrompe automaticamente in caso di errori che suona un po 'radicali per me, ma probabilmente si esime -.. se faccio notare che non gestisce system o exec a meno che non si dispone di use autodie qw(:all);)

Credo che hai bisogno di pensare in modo leggermente diverso su questo. Dopo tutto, lo script sembra aver bisogno di interazione con l'utente. Pertanto, non sarebbe irragionevole chiedere all'utente quale editor usare. È possibile emettere una richiesta a destra prima di eseguire l'editor come in:

Which editor would you like to use [/usr/bin/vi]?

dove il default sarebbe riempito in da $ENV{EDITOR}, $ENV{VISUAL} o, se nessuna è definito, /usr/bin/nano. In questo modo, l'utente può giudicare se il valore ha un senso.

Se siete paranoici su dove punti $ENV{EDITOR}, si potrebbe anche dover essere paranoico sul fatto che qualcuno avrebbe potuto collocato un eseguibile maligno nel percorso dell'utente e la chiamò greateditor o qualcosa del genere.

Uso system con più di un argomento non richiede di disinfettare nulla perché nessun guscio verrà richiamato. Si potrebbe voler controllare se l'eseguibile esiste prima ma complicherà il vostro programma inutilmente, e che ci si deve guardare in $PATH. Anche le variabili ambientali come questi sono attendibili in generale.

Si potrebbe desiderare di chiamare lo stato di uscita dal sistema, però. E si potrebbe provare a chiamare prima $VISUAL, e se non riesce, per chiamare $EDITOR (se $VISUAL è impostato, $EDITOR dovrebbe agire come un ripiego).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top