首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文件路径名称问题,可能存在损坏的字符

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

Stack Overflow用户
提问于 2013-04-04 05:05:30
回答 2查看 170关注 0票数 0

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

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

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

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

奇怪的问题。我传递的filepath有一个非常奇怪的问题。我可以使用以下命令提取它:

代码语言:javascript
运行
复制
my $filepath = $query->param("serverfpath");

上面的代码确实用看起来完全正确的路径填充了$filepath。

但是它失败了,而且失败的方式不是将我带到文件打开错误块,而是调用CGI脚本时会给出一个错误。

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

例如:

代码语言:javascript
运行
复制
$fpath1 = $query->param("serverfpath");
$fpath2 = "/opt/webhost/ims/DOCURVC/data" 

对$fpath1和$fpath2的比较表明,它们是完全相等的。对$fpath1和$fpath2的长度检查显示,它们的长度完全相同。

我尝试过许多清理$fpath1中数据的方法。我把它嚼碎了。我删除了所有非标准字符。

代码语言:javascript
运行
复制
$fpath1  =~ s/[^A-Za-z0-9\-\.\/]//g;

还有这个:

代码语言:javascript
运行
复制
my $safe_filepath_characters = "a-zA-Z0-9_.-/";
$fpath1 =~ s/[^$safe_filepath_characters]//g;

但是不管我做什么,使用$fpath1都会导致错误,使用$fpath2就可以了。

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

对于下面的文件打开块。

代码语言:javascript
运行
复制
$upload_dir = $fpath1 

导致CGI加载完全失败,就好像它找不到CGI一样(我知道这有时是由CGI脚本中的语法错误引起的)。

代码语言:javascript
运行
复制
$uplaod_dir = $fpath2   

我得到一个成功的文件上传

代码语言:javascript
运行
复制
$uplaod_dir = ""        

对cgi的调用不会失败,它会像预期的那样执行下面if的else块。

以下是文件打开块:

代码语言:javascript
运行
复制
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相同的错误,尽管字符看起来完全相同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-04 06:07:16

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

代码语言:javascript
运行
复制
$fpath1  =~ /^([A-Za-z0-9\-\.\/]*)$/;
$fpath1 = $1;
die "Illegal character in fpath1" unless defined $fpath1;

如果污染模式是您的问题,应该可以工作。

票数 0
EN

Stack Overflow用户

发布于 2013-04-04 06:02:19

但它失败了,而且不是以一种将我带到文件打开错误块的方式,而是这样,调用

脚本就会给出一个错误。

脚本标头过早结束?尝试从命令行运行CGI:

代码语言:javascript
运行
复制
perl your_upload_script.cgi serverfpath=/opt/webhost/ims/DOCURVC/data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15798111

复制
相关文章

相似问题

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