\Q...\E 是否应该在替换 s/// 时用于转义元字符?

Should \Q...\E be used to escape meta character in the replacement of s///?

除了 </code> 和 <code> 之外,是否有任何元字符可以出现在替换正则表达式的替换部分中?插入变量时,我应该使用 \Q...\E 吗?

示例:

my $str = 'foo bar baz';
$str =~ s/ba/\Q$benign_user_input\E/g;

我向您努力避免代码注入错误表示敬意。这是您必须不断问自己以避免这种情况的问题:

Am I concatenating two different kinds of content together?

如果答案是肯定的,那么你有一个潜在的问题。如果结果将用作代码,那是一个潜在的代码注入错误。

您是否试图将任意文本与 shell 代码连接起来?潜在的代码注入错误。

您是否试图将任意文本与 SQL 代码连接起来?潜在的代码注入错误。

您是否试图将任意文本与 HTML 代码连接起来?潜在的代码注入错误。

您是否尝试将任意文本与正则表达式模式连接起来?潜在的代码注入错误。

最后一个是 \Q..\E 派上用场的地方。它在模式端用于将文本转换为与该文本匹配的正则表达式模式。


现在让我们在这里进行测试。

你有

my $str = 'foo bar baz';
$str =~ s/ba/$benign_user_input/g;

这相当于

my $str = "foo " . $benign_user_input . "r " . $benign_user_input . "z";

我们有串联,所以我们必须问自己

Am I concatenating two different kinds of content together?

不清楚 foo bar baz 是什么,也不清楚 $benign_user_input 包含什么。所以没有足够的信息来回答这个问题。

例如,这将是一个代码注入错误:

my $benign_user_input = "Document 1.pdf";

my $shell_cmd = 'rm -- file';

$shell_cmd =~ s/file/$benign_user_input/;

但也许不是这样:

my $benign_user_input = "World";

my $greeting = 'Hello, name!';

$greeting =~ s/name/$benign_user_input/;