2016-01-10 38 views
6

Ho scritto il mio piccolo debugger Perl che stampa per ogni riga eseguita, il nome del file corrente e il numero di riga corrispondente. Come posso rilevare se l'attuale affermazione di Perl contiene dati contaminati?Come verificare se l'istruzione Perl corrente contiene dati contaminati?

So che esiste una funzione "macchiata" dal modulo Scalare :: Util. Tuttavia accetta solo un nome di variabile come parametro, non un'istruzione Perl.

Ho collegato Taint a una variabile lessicale per tracciarlo. Se riesco a vedere se un'asserzione è macchiata o meno, posso solo stampare quelle righe che contengono la mia variabile contaminata. Ecco il mio script taint personalizzato:

Taint.pl

use strict; 
use warnings; 

use Taint::Runtime qw(taint_start taint); 
taint_start(); 

my $data = taint("abc"); --> interesting 
my $noise = "noise"; --> not interesting 
my $evil = $data . " evil"; --> interesting 

Debugger.pl

sub DB::DB{ 

    my($package, $filename, $line) = caller; 

    print $filename . ":" . $line . " "; 
    scalar <STDIN>; 

} 

1; 
+2

Eccezione di cattura con eval()? –

+0

Ho trovato questo codice che usa eval per catturare l'eccezione, ma non so come passare un'istruzione Perl ad esso. $ locale; ritorno! eval {eval ("#". substr (join ("", @_), 0, 0)); 1}; – Silence

+0

Che cosa vuoi testare esattamente e perché non puoi usare una variabile? –

risposta

0

Come descritto nel POD Documentation for Taint::Runtime c'è un sub chiamato is_tainted che restituirà vero se si passa un valore corrotto e falso altrimenti.

Ti consigliamo di cambiare la linea per un uso specifico di importare quella funzione:

use Taint::Runtime qw(taint_start taint is_tainted);

Nel tuo esempio di script Taint.pl, una volta fatto questo, is_tainted($data) sarebbe valutata come vera, sarebbe is_tainted($noise) false e is_tainted($evil) sarebbe vero.

Se si dispone di un'espressione più complessa per verificare la contaminazione, è sufficiente valutarla in uno scalare e se eventuali input a tale valutazione sono stati macchiati, l'espressione e, quindi, lo scalare saranno anche considerati contaminati. Controllare se quello scalare è contaminato equivale a controllare l'espressione. Se l'espressione produce un valore di lista, qualcosa come join lo inserirà in uno scalare abbastanza bene da rilevare la contaminazione.