gpt4 book ai didi

perl - 在 Perl 中验证路径

转载 作者:行者123 更新时间:2023-12-04 00:51:00 25 4
gpt4 key购买 nike

我正在为我正在类的实验室工作,我有一个关于检查特定输入的 Perl 字符串的问题。

基本上我想做的是确保我从用户那里收到的输入是这样的:

/home/[anything is valid]/memo

本实验的重点是防止教师提供给我们的简单程序中的路径名攻击。因此,我想在对它进行任何操作之前检查以确保用户提供的路径名符合此格式。

我目前在 Perl 中使用 abs_path() 方法来获取传入字符串的绝对路径,但现在我需要确保绝对路径包含我上面的内容.

这是我想要实现的目标:

my $input = "localhost:8080/cgi-bin/memo.cgi?memo=/home/megaboz/memo/new_CEO";
my $memo = '/home/megaboz/memo/new_CEO';
my $pathName = abs_path($memo);
if($pathName ne "/home/[anything works here]/memo/[anything works here]") {
#throw an error
}
else {
#process input
}

有什么建议吗?

最佳答案

欢迎来到regular expressions的精彩世界| ,这是 Perl 非常擅长的。

让我们来看看如何构建其中之一。首先,我们通常使用正斜杠来表示正则表达式,即

/some-expression/

但由于您的路径中有正斜杠,这样做会涉及一些困惑的字符串转义,因此我们将使用 m 替代分隔符。

m(some-expression)

现在,我们要以 /home/ 开始,以 /memo 结束。您可以在上面的链接中阅读所有关于不同语法的信息,但在正则表达式中,我们使用 ^$ (称为 anchor )分别表示开始和结束字符串。所以我们的正则表达式看起来像

m(^/home/SOMETHING/memo$)

现在是中间的部分。我们希望一切都过去。您的通用“任何”正则表达式是一个点 .,它匹配任何单个字符。我们可以应用 Kleene 星号 *,它表示“之前出现的任何内容的零个或更多”。所以 .* 一起表示“零或更多的任何东西”。

m(^/home/.*/memo$)

这是我们的正则表达式。要应用它,我们使用 =~ 来询问“是否匹配”,或使用 !~ 来询问“是否失败”。您的代码的结构方式,我们要检查失败。

if ($pathName !~ m(^/home/.*/memo$)) {
...
} else {
...
}

正则表达式相当普遍,基本上可以在任何编程语言中使用,因此它绝对是一项值得拥有的技能(尽管 Perl 以其强大的正则表达式支持而闻名,因此您是进行字符串匹配的正确工具能力)。

关于perl - 在 Perl 中验证路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66662739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com