Perl 什么';在将字符串传递给系统调用之前,我需要过滤的最小字符集是多少?

Perl 什么';在将字符串传递给系统调用之前,我需要过滤的最小字符集是多少?,perl,security,Perl,Security,假设给出了以下Perl代码: my $user_supplied_string = &retrieved_from_untrusted_user(); $user_supplied_string =~ s/.../.../g; # filtering done here my $output = `/path/to/some/command '${user_supplied_string}'`; 代码显然不安全,但假设唯一可以更改的是第2行的过滤代码 我的问题: 第#2行需要过滤的最

假设给出了以下Perl代码:

my $user_supplied_string = &retrieved_from_untrusted_user();
$user_supplied_string =~ s/.../.../g; # filtering done here
my $output = `/path/to/some/command '${user_supplied_string}'`;
代码显然不安全,但假设唯一可以更改的是第2行的过滤代码

我的问题:

  • 第#2行需要过滤的最小字符集是什么,以确保上述代码的安全
请注意:

  • 在这种情况下,白名单不是一个选项,所以请将您的答案集中在过滤哪些内容以使其安全。更具体地说,;为了保证安全,要过滤掉的最小字符集是什么?其他一切都离题了
  • 确保您的答案符合所述问题(“第2行需要过滤的最小字符集是什么,以确保上述代码的安全?”)。如果你的回答没有提到这个非常具体的问题,那么就不要发帖。谢谢

首先,考虑到您关心的是安全问题,我建议您调查一下。至于允许shell看到的最小字符集,最好不要让shell看到任何字符:

my $output = do {
    local $/;
    open my $pipe, "-|", "/path/to/some/command", $user_supplied_string
        or die "could not run /path/to/some/command: $!";
    <$pipe>;
};
my$output=do{
本地$/;
打开我的$pipe、“-|”、“/path/to/some/command”、$user\u提供的\u字符串
或者“无法运行/path/to/some/command:$!”;
;
};

稍作研究后,以下可能是您要查找的最小集合,至少在类UNIX系统的子集上是如此。当然,我没有亲自测试过,所以YMMV:

&;`'\"|*?~<>^()[]{}$\n\r &;`'\“|*?~^()[]{}$\n\r\n 在正则表达式中:

s/[\&\;\`\'\\\"\|\*\?\~\<\>\^\(\)\[\]\{\}\$\n\r]//g s/[\&\\\\\\\\\\\\\\\*\?\\\\\\\\^\(\)\[\]\{\\\\$\n\r]//g
我不认为在实际代码中实际使用它是一个好主意,但出于纯粹的好奇,我可以看出它是多么有趣。

允许的字符集取决于系统调用中的应用程序将如何处理它们。还有shell的特殊字符,但这只是问题的一部分。您还必须确保给命令的值是有效的输入,这需要更多的工作

例如,请参阅我关于安全性的一章,其中我详细介绍了问题的血淋淋的细节


也许你可以解释为什么你的问题把你的双手绑在背后,蒙住你的眼睛。如果这些是您的限制,那么您的问题就不是技术性的。

从这里开始,您可能会得到一些帮助:这里也是:如果您解释了这些有点奇怪的限制的原因,您可能会得到更多的响应。从表面上看,有些人可能会认为这是一个家庭作业问题。@knorv:我说的是“一些人”,而不是我。:)我只是想帮你表达你的问题,这样你就可以得到你想要的信息。@knorv没有最小值集。一切都取决于实际使用的外壳。解决方法是像我在回答中所做的那样,完全避开外壳,从而避开问题。其他任何东西都是危险的黑客行为。