我在这里有一点神秘,我不太了解根本原因。当试图从脚本中调用unlink时,我得到一个“在使用-T开关运行时取消链接的不安全依赖项”。这并不神秘,因为我意识到这意味着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通过使用本地时间(时间)函数脚本本身产生的,所以它不应该是污点。 $ item_photo会在污点检查前使用$ adID和$ extensioncheck进行重新分配,因此新的$ item_photo现在未被识别。我知道这是因为$ item_photo本身在脚本中将后者解除链接本身没有问题。 $ item_photo只用了足够长的时间,以便在使用未链接功能扔掉之前使用ImageMagick创建三个其他图像文件。从$ item_photo的ImageMagick处理创建的三个文件名就像这样创建。
$largepicfilename = $adID . "_large.jpg";
$adpagepicfilename = $adID . "_adpage.jpg";
$thumbnailfilename = $adID . "_thumbnail.jpg";
的路径预先计划在新的文件名来创建网址,并在脚本的顶部被定义,因此他们不能有漏为好。这些文件的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 dependency'标志的地方。
# 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;
}
}
我知道我可以再次将它们解开,甚至只是在知道数据是安全的情况下将它们吹走,但这不是重点。我想要了解的是,为什么这首先发生,因为我不了解这些以前未被污染的数据如何被视为受污染。任何帮助启发我错过这个连接的地方都会得到真正的赞赏,因为我真的很想理解这一点,而不是仅仅为了解决这个问题而编写代码。
必须再次超过我的perlsec,因为我可能错过了这一点。虽然在这种情况下,数据被写入只设置了所有者权限的文件夹,所以另一个恶意程序不应该能够从外部程序更改数据。 – Epiphany 2010-08-28 06:33:17
“所以另一个恶意程序不应该能够改变数据”。那么,没有办法来验证。污点检查器需要是超偏执的,否则使用它就没有多大意义。 – Thilo 2010-08-28 06:43:10
和Thilo:谢谢你们......我想我已经写了另外一套正则表达式,所以我可以继续。喜欢斗,格雷格! :) – Epiphany 2010-08-28 06:47:03