8

実行された各行、現在のファイル名、および対応する行番号を出力する、独自の小さな Perl デバッガーを作成しました。現在の Perl ステートメントに汚染されたデータが含まれているかどうかを検出するにはどうすればよいですか?

モジュール Scalar::Util から「汚染された」関数があることは知っています。ただし、Perl ステートメントではなく、変数名のみをパラメーターとして受け入れます。

レキシカル変数に Taint を付けてトレースしました。ステートメントが汚染されているかどうかを確認できれば、汚染された変数を含む行のみを出力できます。これが私のカスタム taint スクリプトです。

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;
4

1 に答える 1

1

Taint::Runtimeの POD ドキュメントで説明されているようis_taintedに、汚染された値を渡すと true を返し、それ以外の場合は false を返すsub が呼び出されます。

関連する使用行を変更して、その関数をインポートする必要があります。

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

あなたの例の Taint.pl スクリプトでは、これが完了is_tainted($data)すると、true に評価され、 is_tainted($noise)false になり、is_tainted($evil)true になります。

汚染をチェックするより複雑な式がある場合は、単にそれをスカラーに評価し、その評価への入力が汚染されている場合、式とスカラーも汚染されていると見なされます。そのスカラーが汚染されているかどうかを確認することは、式を確認することと同じです。式がリスト値を生成する場合、結合のようなものは、汚染を検出するのに十分なスカラーに適合します。

于 2016-08-13T09:40:07.253 に答える