我这里有一个谜,我不太了解其根本原因。在尝试从脚本中调用UNLINK时,我在使用-t switch跑步时会获得“不安全的依赖性”。这不是一个谜,因为我意识到这意味着珀尔说我正在尝试使用污染的数据。谜团是,此数据以前是在另一个将其保存到磁盘的脚本中没有污染的,没有任何问题。

以下是……第一个脚本使用以下内容创建二进制文件名

# 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创建其他三个图像文件,然后再使用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函数删除,这是我获得“ 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;
  }
}

我知道我可以再次解开它们,甚至可以通过知道数据是安全的,但这不是重点。我想要的是首先要理解为什么会发生这种情况,因为我不了解现在如何看待该以前未经污染的数据被视为污染。任何帮助我缺少这种联系的地方的任何帮助都将不胜感激,因为我真的想理解这一点,而不仅仅是写黑客修复它。

有帮助吗?

解决方案

将数据保存到文件并不能保存数据中的任何“污染”位。它只是来自外部源的数据,因此,当Perl读取它时,它会自动受到污染。在您的第二个脚本中,您将必须明确地不进行数据。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top