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 本身在脚本后面的 unlink 本身没有问题。$item_photo 仅用于使用 ImageMagick 创建其他三个图像文件的时间,然后使用 unlink 函数将其丢弃。通过 $item_photo 的 ImageMagick 处理创建的三个文件名就是这样创建的。

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

然后我把它们写到唱片上,我知道一切都没有受到污染。

现在是棘手的部分。在第二个脚本中,我读取这些文件以使用 unlink 函数删除这些文件,这就是我获得“不安全依赖”标志的地方。

# 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 读取它时,它会自动受到污染。在您的第二个脚本中,您必须明确地清除数据。

毕竟,其他一些恶意程序可能在第二个脚本有机会读取文件之前更改了文件中的数据。

于 2010-08-28T06:21:54.027 回答