安全使用#!正则表达式中的$ in变量?

时间:2015-03-23 23:47:07

标签: regex linux perl

有人可以告诉我,如果在@rx中拥有所有这些特殊字符是否安全?我关注的是# !$

如果不安全,我如何确保正则表达式不会解释@rx中的元素?

#!/usr/bin/perl
use strict;
use warnings;

my $doc = do { local $/; <STDIN> };

my @rx = (
    'mariadb:\n  build: ',
    '#!/bin/bash\n\n/usr/bin/mysqld_safe',
    'FROM centos:7',
    '#!/bin/sh\n# This is /usr/libexec/mariadb-',
    '#!/bin/bash\nVOLUME_HOME="/var/lib/mysql"',
    '#!/bin/bash\nMYSQL="/usr/bin/mysql -u$DB_ENV_DBUSER'
);

my @a = ();

foreach my $r (@rx) {
    push @a, $doc =~ /($r.{3000})/sg;
}

my $n = int(rand(999999999999999));
for my $i (0 ..$#a) {
    system("echo '$a[$i]' > ext$n$i");
}

1 个答案:

答案 0 :(得分:4)

您可以通过执行以下操作自动转义任何必要的字符:

push @a, $doc =~ /(\Q$r\E.{3000})/sg;

但你的正则表达可能不像你想要的那样工作;它只会在文件的第一部分找到你的字符串,而不是它们扩展到最后3000个字符。如果它们之间没有其他3000个字符,它也只能找到两个中的一个。这两个问题都可以通过以下方式解决:

push @a, $doc =~ /(?=(\Q$r\E.{0,3000}))/sg;