我在这里有点神秘,我不太了解其根本原因。尝试从脚本调用 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;
}
}
我知道我可以再次清除它们,或者甚至只是通过知道数据是安全的来打击它们,但这不是重点。我想首先了解为什么会发生这种情况,因为我不了解这些以前未受污染的数据现在如何被视为受污染。任何有助于启发我缺少此连接的地方将不胜感激,因为我真的想理解这一点,而不仅仅是编写黑客来修复它。