Perl 验证用户提供的相对文件系统路径

Perl 验证用户提供的相对文件系统路径,perl,filesystems,Perl,Filesystems,我希望允许用户浏览我的web服务器文件系统的某个部分,确保他们无法访问父目录。此部分是动态的,因此无法定义 我认为我的最佳选择是将用户提供的相对路径附加到恒定的基本路径上,即: use Cwd; use CGI qw/:standard/; use File::Spec::Functions; my $base_path = catfile( getcwd, 'base' ); my $rel_path = param('rel_path'); my $full_path = catfile

我希望允许用户浏览我的web服务器文件系统的某个部分,确保他们无法访问父目录。此部分是动态的,因此无法定义

我认为我的最佳选择是将用户提供的相对路径附加到恒定的基本路径上,即:

use Cwd;
use CGI qw/:standard/;
use File::Spec::Functions;

my $base_path = catfile( getcwd, 'base' );
my $rel_path  = param('rel_path');
my $full_path = catfile( $base_path, $rel_path );

print $full_path;
必须对用户提供的相对路径/完整路径执行什么验证/清理。我不能百分之百确定用户可以以何种方式操纵相对路径并破坏系统和应用程序的完整性

谢谢


Chris

只需检查$full\u path前面是否有$base\u path

unless ( $full_path =~ m{^$base_path} ) { $full_path = $base_path; }
或者明确禁止$rel_路径中的双点:

$rel_path = '' if $rel_path =~ /\.\./;

因为基本路径放置是硬编码的,所以您的条件永远不会为真。这也意味着我不必显式地将完整路径定义为基本路径?黑客通常使用“../../../../../../../../../../../../../etc/passwd”等路径检查CGI参数中的路径。非常好的一点是,必须过滤上层工作目录的段,即“/../”,否则用户可以轻松访问禁止的父路径。