gpt4 book ai didi

regex - 通过正则表达式进行 Perl 污染

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

精简版

在下面的代码中,$1被污染了,我不明白为什么。

长版

我在运行 Foswiki在带有 -T 的 perl v5.14.2 系统上启用污点检查模式。
调试该设置的问题,我设法构建了以下 SSCCE。 (请注意,我编辑了这篇文章,第一个版本更长更复杂,评论仍然引用。)

#!/usr/bin/perl -T
use strict;
use warnings;
use locale;
use Scalar::Util qw(tainted);
my $var = "foo.bar_baz";
$var =~ m/^(.*)[._](.*?)$/;
print(tainted($1) ? "tainted\n" : "untainted\n");

虽然输入字符串 $var未受污染且正则表达式固定,生成的捕获组 $1被污染了。我觉得这很奇怪。

perlsec manual关于污点和正则表达式有这样的说法:

Values may be untainted by using them as keys in a hash; otherwise the only way to bypass the tainting mechanism is by referencing subpatterns from a regular expression match. Perl presumes that if you reference a substring using $1, $2, etc., that you knew what you were doing when you wrote the pattern.



我想即使输入被污染,输出仍然不会被污染。从未受污染的输入中观察相反的受污染输出,感觉就像是 perl 中的一个奇怪的错误。但是如果读到更多的 perlsec,它也会将用户指向 the SECURITY section of perllocale .我们在那里读到:

when use locale is in effect, Perl uses the tainting mechanism (see perlsec) to mark string results that become locale-dependent, and which may be untrustworthy in consequence. Here is a summary of the tainting behavior of operators and functions that may be affected by the locale:

  • Comparison operators (lt, le , ge, gt and cmp) […]

  • Case-mapping interpolation (with \l, \L, \u or \U) […]

  • Matching operator (m//):

    Scalar true/false result never tainted.

    Subpatterns, either delivered as a list-context result or as $1 etc. are tainted if use locale (but not use locale
    ':not_characters'
    ) is in effect, and the subpattern regular expression contains \w (to match an alphanumeric character), \W (non-alphanumeric character), \s (whitespace character), or \S (non whitespace character). The matched-pattern variable, $&, $`
    (pre-match), $' (post-match), and $+ (last match) are also tainted if use locale is in effect and the regular expression contains \w, \W, \s, or \S.

  • Substitution operator (s///) […]

        [⋮]



这看起来应该是一个详尽的 list 。而且我不知道它如何适用:我的正则表达式没有使用任何 \w , \W , \s\S ,所以它不应该依赖于语言环境。

有人可以解释为什么这段代码会污染变量 $1 ?

最佳答案

目前问题中引用的文档与 perl 5.18.1 的实际实现之间存在差异。问题是字符类。文档提到 \w , \s , \W , \S听起来像是一个详尽的列表,而几乎每次使用 […] 的实现都会受到影响。 .

正确的解决方案可能介于两者之间:像 [[:word:]] 这样的字符类应该污染,因为它取决于语言环境。我的固定列表不应该。字符范围如 [a-z]取决于整理,所以在我个人看来,它们也应该被污染。 \d取决于语言环境对数字的看法,因此它也应该受到污染,即使它既不是目前提到的转义序列之一,也不是括号内的类。

所以在我看来,文档和实现都需要修复。 Perl 开发人员正在致力于此。进度信息请看the perl bug report我报了案。

对于固定的字符列表,一个可行的解决方法似乎是将表达式作为析取,即 (?:\.|_)而不是 [._] .它更冗长,但即使使用当前(在我看来有缺陷的)perl 版本也应该可以工作。

关于regex - 通过正则表达式进行 Perl 污染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355879/

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