首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我以前未被污染的数据怎么会再次被污染?

我以前未被污染的数据怎么会再次被污染?
EN

Stack Overflow用户
提问于 2010-08-28 14:17:11
回答 1查看 431关注 0票数 2

我在这里有一个谜团,我不太明白其根本原因。当我试图从脚本调用unlink时,我得到了一个‘unlink in Insecure in unlink with -T switch’。这并不神秘,因为我意识到这意味着Perl在说我正在尝试使用受污染的数据。令人费解的是,这些数据之前未被保存在另一个脚本中,该脚本将其保存到磁盘上,没有任何问题。

事情是这样的.第一个脚本使用以下内容创建二进制文件名

代码语言:javascript
复制
# 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(时间)函数生成的,因此它不应该受到影响。在污点检查之前,使用$adID和$extensioncheck重新分配$item_photo,因此新的$item_photo现在是未受污染的。我之所以知道这一点,是因为$item_photo本身在后面的脚本中对取消链接本身没有问题。在使用unlink函数抛出$item_photo之前,使用ImageMagick创建其他三个图像文件的时间仅够使用它。通过$item_photo的ImageMagick处理创建的三个文件名是这样创建的。

代码语言:javascript
复制
$largepicfilename  = $adID . "_large.jpg";
$adpagepicfilename = $adID . "_adpage.jpg";
$thumbnailfilename = $adID . "_thumbnail.jpg";

路径被放在新文件名的前面以创建URL,并且在脚本的顶部定义,因此它们不会被污染。这些文件的URL是这样生成的。

代码语言:javascript
复制
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依赖”标志的地方。

代码语言:javascript
复制
# 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;
  }
}

我知道我可以再次清除它们,甚至可以通过知道数据是安全的来吹嘘它们,但这不是重点。我想要的是首先了解为什么会发生这种情况,因为我不明白这些以前未受污染的数据现在是如何被视为受污染的。如果你能帮助我理解这一点,我将不胜感激,因为我真的想要理解这一点,而不仅仅是写出修复它的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-28 14:21:54

将数据保存到文件不会与数据一起保存任何“受污染”的位。它只是来自外部源的数据,所以当Perl读取它时,它会自动被污染。在第二个脚本中,您必须显式地清除数据。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3589709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档