文件路径名称问题,可能是损坏的字符

时间:2013-04-03 21:05:30

标签: linux perl file cgi

Perl和html,Linux上的CGI。 文件路径名问题,在表单字段中传递给服务器上的CGI。 问题在于Linux文件路径,而不是PC端。

我正在使用2个程序, 1)多年前编写的程序,在perl程序中生成动态html,并作为表单呈现给用户。我通过插入所需的代码来修改,以允许用户从他们的PC中选择一个文件,放在Linux机器上。

因为这个程序已经知道了linux端需要的文件路径,所以我将这个文件路径传递给隐藏的表单字段,编程为2。

2)Linux端的CGI程序,在发布(1)上的表单时运行。

奇怪的问题。 我传递的文件路径有一个非常奇怪的问题。 我可以使用

提取它
my $filepath = $query->param("serverfpath");

上面确实填充$ filepath,看起来就像是正确的路径 但它失败了,并没有以某种方式将我带到文件打开错误块,但是这样调用CGI脚本会产生错误。

但是,如果我使用完全相同的字符串填充$ filepath,通过硬编码,它可以工作,并且我的文件成功上传。

例如:

$fpath1 = $query->param("serverfpath");
$fpath2 = "/opt/webhost/ims/DOCURVC/data" 

$ fpath1和$ fpath2的比较显示它们完全相同。 $ fpath1和$ fpath2的长度检查显示它们的长度完全相同。

我在$ fpath1中尝试了很多清理数据的方法。 我扼杀它。 我删除了所有非标准字符。

$fpath1  =~ s/[^A-Za-z0-9\-\.\/]//g;

和此:

my $safe_filepath_characters = "a-zA-Z0-9_.-/";
$fpath1 =~ s/[^$safe_filepath_characters]//g;

但无论我做什么,使用$ fpath1会导致错误,使用$ fpath2可以正常工作。

$ fpath1中的数据有什么问题,这会导致它成功地与$ fpath2进行比较,但不相等,在视觉上看起来完全相同,显示具有完全相同的长度,但不能正常工作?

对于下面的文件打开块。

$upload_dir = $fpath1 

导致CGI加载完全失败,好像它找不到CGI(我知道CGI脚本中有时会出现语法错误)。

$uplaod_dir = $fpath2   

我获得了成功的文件上传

$uplaod_dir = ""        

对cgi的调用不会失败,如果符合预期,它会执行下面的else块。

这里是文件打开块:

if (open ( UPLOADFILE, ">$upload_dir/$filename" ))   
{
binmode UPLOADFILE;

while ( <$upload_filehandle> )
{
print UPLOADFILE;
}

close UPLOADFILE;
$msgstr="Done with Upload: upload_dir=$upload_dir filename=$filename";
}
else
{
$msgstr="ERROR opening for upload: upload_dir=$upload_dir filename=$filename";
}

我应该在$ fpath1上执行哪些其他测试,以找出它与其硬编码等效$ fpath2

的工作方式不同的原因

我确实尝试过字符替换,一次一个字符,从$ fpath2到$ fpath1。 即使使用单个字符执行此操作,也会导致$ fpath1与$ fpath2具有相同的错误,尽管该字符看起来完全相同。

2 个答案:

答案 0 :(得分:0)

  

但是它失败了,并没有以某种方式将我带到文件打开错误块,但是这样调用CGI脚本会产生错误。

脚本标题的提前结束?尝试从命令行运行CGI:

perl your_upload_script.cgi serverfpath=/opt/webhost/ims/DOCURVC/data

答案 1 :(得分:0)

您的CGI是否可以使用-T(污点模式)开关运行perl(例如,#!/usr/bin/perl -T)?如果是这样,来自不受信任的来源(例如用户输入,URI和表单字段)的任何值都不允许在系统操作中使用,例如open,直到它使用正则表达式捕获未被污染。请注意,使用s///进行就地修改将取消该值。

$fpath1  =~ /^([A-Za-z0-9\-\.\/]*)$/;
$fpath1 = $1;
die "Illegal character in fpath1" unless defined $fpath1;
如果您的问题是污染模式,

应该有效。