2016-01-10 1 views
6

J'ai écrit mon propre petit débogueur Perl qui imprime pour chaque ligne exécutée, le nom de fichier actuel et le numéro de ligne correspondant. Comment puis-je détecter si l'instruction Perl actuelle contient des données corrompues?Comment vérifier si l'instruction Perl actuelle contient des données corrompues?

Je sais qu'il existe une fonction "corrompue" du module Scalar :: Util. Cependant, il n'accepte qu'un nom de variable en tant que paramètre, pas une instruction Perl.

J'ai attaché Taint à une variable lexicale pour le tracer. Si je suis en mesure de voir si une déclaration est entachée ou non, je ne peux imprimer que les lignes contenant ma variable contaminée. Voici mon script taint personnalisé:

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

Exception de saisie avec eval()? –

+0

J'ai trouvé ce code qui utilise eval pour attraper l'exception, mais je ne sais pas comment lui passer une instruction Perl. local $ @; retour! eval {eval ("#". substr (join ("", @_), 0, 0)); 1 }; – Silence

+0

Qu'est-ce que vous voulez exactement tester, et pourquoi vous ne pouvez pas utiliser une variable? –

Répondre

0

Comme décrit dans le POD Documentation for Taint::Runtime il y a un sous appelé is_tainted qui renverra true si vous lui transmettez une valeur fausse et false sinon.

Vous voulez changer votre ligne d'utilisation pertinente pour importer cette fonction:

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

Dans votre exemple de script Taint.pl, une fois que cela est fait, is_tainted($data) évaluerait true, is_tainted($noise) serait false, et is_tainted($evil) serait vrai.

Si vous avez une expression plus complexe à vérifier pour l'altération, évaluez-la simplement en un scalaire et si des entrées à cette évaluation étaient entachées, l'expression et donc le scalaire seront également considérés comme corrompus. Vérifier si ce scalaire est corrompu équivaut à vérifier l'expression. Si l'expression produit une valeur de liste, quelque chose comme join l'insérera dans un scalaire suffisamment pour détecter l'erreur.