应该\Q..\E是否用于替换s///中的转义元字符



除了1$1之外,是否有任何元字符可以出现在替换正则表达式的替换部分?插值变量时,我应该使用Q...E吗?

示例:

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

我向您致敬,因为您努力避免代码注入错误。为了避免这种情况,你必须不断地问自己一个问题:

我是否将两种不同类型的内容连接在一起?

如果答案是肯定的,则表示您存在潜在问题。如果结果将被用作代码,那么这是一个潜在的代码注入错误。

您是否试图将任意文本与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";

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

我是否将两种不同类型的内容连接在一起?

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/;

最新更新