\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/;
除了 </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/;