解决绝对路径的Perl正则表达式是什么?

Jim*_*_Bo 2 regex perl absolute-path taint

好吧,我尝试过但都失败了,我又来了.

我需要匹配我的abs路径模式.

 /public_html/mystuff/10000001/001/10/01.cnt
Run Code Online (Sandbox Code Playgroud)

我处于污点模式等.

#!/usr/bin/perl -Tw
use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
$ENV{PATH} = "bin:/usr/bin";
delete ($ENV{qw(IFS CDPATH BASH_ENV ENV)});
Run Code Online (Sandbox Code Playgroud)

我需要打开相同的文件几次或更多,并且污点强迫我每次都取消文件名.虽然我可能做错了其他事情,但我仍然需要帮助构建这个模式以供将来参考.

my $file = "$var[5]";
if ($file =~ /(\w{1}[\w-\/]*)/) {
$under = "/$1\.cnt";
} else {
ErroR();
}
Run Code Online (Sandbox Code Playgroud)

你可以通过我的初学者尝试看到我几乎无能为力.

我不得不添加正斜杠和扩展,$1因为我的构造不好,但正在工作,正则表达式.

所以,我需要帮助学习如何修复我的表达所以$1代表/public_html/mystuff/10000001/001/10/01.cnt

有人可以握住我的手并告诉我如何制作:

$file =~ /(\w{1}[\w-\/]*)/ 匹配我的绝对路径/public_html/mystuff/10000001/001/10/01.cnt

谢谢你的帮助.

Sin*_*nür 7

编辑:$在模式中使用(我之前做过)在这里是不可取的,因为它可以\n在文件名的末尾匹配.请\z改用,因为它明确匹配字符串的结尾.

在匹配的内容中尽可能具体:

my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';

if ( $fn =~ m!
    ^(
        /public_html
        /mystuff
        /[0-9]{8}
        /[0-9]{3}
        /[0-9]{2}
        /[0-9]{2}\.cnt
     )\z!x ) {
     print $1, "\n";
 }
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过将我假设为'/public_html/mystuff'变量中的公共前缀并将结构中的各种组件组合在一起来减少代码占用的垂直空间qr//(请参阅perldoc perlop),然后使用条件运算符?::

#!/usr/bin/perl

use strict;
use warnings;

my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';
my $prefix = '/public_html/mystuff';
my $re = qr!^($prefix/[0-9]{8}/[0-9]{3}/[0-9]{2}/[0-9]{2}\.cnt)\z!;

$fn = $fn =~ $re ? $1 : undef;

die "Filename did not match the requirements" unless defined $fn;
print $fn, "\n";
Run Code Online (Sandbox Code Playgroud)

另外,我无法像你一样使用相对路径进行调和

$ENV{PATH} = "bin:/usr/bin";
Run Code Online (Sandbox Code Playgroud)

使用污点模式.你的意思是

$ENV{PATH} = "/bin:/usr/bin";
Run Code Online (Sandbox Code Playgroud)


bri*_*foy 6

你谈到每次都无法取消文件路径.这可能是因为你没有划分你的程序步骤.

总的来说,我将这些程序分解为多个阶段.其中一个早期阶段是数据验证.在我让程序继续之前,我验证了所有可以的数据.如果其中任何一个不符合我的预期,我不会让程序继续下去.我不想中途通过一些重要的东西(比如将东西插入数据库)只是为了发现一些错误的东西.

因此,当您获取数据时,将所有数据解开并将值存储在新的数据结构中.之后不要使用原始数据或CGI功能.CGI模块就是将数据传递给您的程序.在那之后,程序的其余部分应该尽可能少地了解CGI.

我不知道你在做什么,但实际的文件名作为输入几乎总是一种设计气味.