2

ここにはちょっとした謎があり、根本的な原因をよく理解していません。スクリプトから unlink を呼び出そうとすると、「-T スイッチを使用して実行中に unlink で安全でない依存関係が発生しました」というメッセージが表示されます。これは Perl が私が汚染されたデータを使おうとしていると言っているということを意味していることに気付いたので、それはミステリーではありません。謎は、このデータが問題なくディスクに保存された別のスクリプトで、以前は汚染されていなかったということです。

これがその方法です...最初のスクリプトは、次を使用してバイナリファイル名を作成します

# For the binary file upload
my $extensioncheck = '';

my $safe_filename_characters = "a-zA-Z0-9_.";
  if ( $item_photo )  
  { 
    # Allowable File Type Check
    my ( $name, $path, $extension ) = fileparse ( $item_photo, '\..*' );
    $extensioncheck = lc($extension);
    if (( $extensioncheck ne ".jpg" ) && ( $extensioncheck ne ".jpeg" ) &&
        ( $extensioncheck ne ".png" ) && ( $extensioncheck ne ".gif" ))
    {
      die "Your photo file is in a prohibited file format.";  
    }

    # Rename file to Ad ID for adphoto directory use and untaint
    $item_photo = join "", $adID, $extensioncheck;
    $item_photo =~ tr/ /_/;  
    $item_photo =~ s/[^$safe_filename_characters]//g;  
    if ( $item_photo =~ /^([$safe_filename_characters]+)$/ ) { $item_photo = $1; }
    else {  die "Filename contains invalid characters"; }  
    }

$adID は localtime(time) 関数を使用してスクリプト自体によって生成されるため、汚染されるべきではありません。$item_photo は汚染チェックの前に $adID と $extensioncheck を使用して再割り当てされるため、新しい $item_photo は汚染されていません。$item_photo自体は、スクリプトの後半で自分自身をリンク解除しても問題ないため、これを知っています。$item_photo は、リンク解除機能を使用して投げられる前に、ImageMagick を使用して他の 3 つの画像ファイルを作成するのに十分な時間だけ使用されます。$item_photo の ImageMagick 処理で作成される 3 つのファイル名は、このように単純に作成されます。

$largepicfilename  = $adID . "_large.jpg";
$adpagepicfilename = $adID . "_adpage.jpg";
$thumbnailfilename = $adID . "_thumbnail.jpg";

パスは、URL を作成するために新しいファイル名の先頭に追加され、スクリプトの先頭で定義されるため、同様に汚染されることはありません。これらのファイルの URL はこのように生成されます。

my $adpageURL = join "", $adpages_dir_URL, $adID, '.html';
my $largepicURL  = join "", $adphotos_dir_URL, $largepicfilename;
my $adpagepicURL = join "", $adphotos_dir_URL, $adpagepicfilename;
my $thumbnailURL = join "", $adphotos_dir_URL, $thumbnailfilename;

次に、すべてが汚染されていないことを知って、それらを記録に書き込みます。

厄介な部分が来ます。2 番目のスクリプトでは、これらのファイルを読み取り、リンク解除機能を使用して削除します。ここで、「Insecue 依存関係」フラグを取得しています。

# Read in the current Ad Records Database
open (ADRECORDS, $adrecords_db) || die("Unable to Read Ad Records Database");
flock(ADRECORDS, LOCK_SH);
seek (ADRECORDS, 0, SEEK_SET);
my @adrecords_data = <ADRECORDS>;
close(ADRECORDS);

# Find the Ad in the Ad Records Database
ADRECORD1:foreach $AdRecord(@adrecords_data)
{
  chomp($AdRecord);
  my($adID_In, $adpageURL_In, $largepicURL_In, $adpagepicURL_In, $thumbnailURL_In)=split(/\|/,$AdRecord);

  if ($flagadAdID ne $adID_In) { $AdRecordArrayNum++; next ADRECORD1 }
  else
  {
    #Delete the Ad Page and Ad Page Images
    unlink ("$adpageURL_In");
    unlink ("$largepicURL_In");
    unlink ("$adpagepicURL_In");
    unlink ("$thumbnailURL_In");
    last ADRECORD1;
  }
}

データが安全であることを知っていれば、再び汚染を除去したり、吹き飛ばしたりできることはわかっていますが、それは重要ではありません。私が望むのは、なぜこれが最初に起こっているのかを理解することです。以前は汚染されていなかったこのデータが、現在汚染されていると見なされていることを理解していないからです。ハックを書いて修正するのではなく、これを本当に理解したいので、この接続が欠けている場所を啓発する助けがあれば、本当に感謝しています。

4

1 に答える 1

4

データをファイルに保存しても、「汚染された」ビットはデータとともに保存されません。これは外部ソースからの単なるデータであるため、Perl がそれを読み取ると、自動的に汚染されます。2 番目のスクリプトでは、データを明示的に untaint する必要があります。

結局のところ、別の悪意のあるプログラムが、2 番目のスクリプトがファイルを読み取る機会を得る前に、ファイル内のデータを変更している可能性があります。

于 2010-08-28T06:21:54.027 に答える