我在一个开源项目中找到了这段代码。这里的参数传递了一些非零的密码。我想知道下面的代码到底为我做了什么
perl -pe "s|$PASSWORD|<PASSWORD>|g"发布于 2019-05-09 19:20:56
这是一个错误的版本
PASSWORD="$PASSWORD" perl -pe's/\Q$ENV{PASSWORD}/<PASSWORD>/g'在这个经过修正的版本中,shell启动perl,将shell变量$PASSWORD作为环境变量PASSWORD传递给perl。
perl将遍历指定文件的每一行(如果没有提供路径作为参数,则为STDIN )。在每个实例中,它都会将环境变量PASSWORD的值的每个实例替换为<PASSWORD>。这些可能修改过的行将它们输出到STDOUT。
$ PASSWORD=bar
$ cat file
foo
bar
foobarfoobarfoo
foo
$ PASSWORD="$PASSWORD" perl -pe's|\Q$ENV{PASSWORD}|<PASSWORD>|g' file
foo
<PASSWORD>
foo<PASSWORD>foo<PASSWORD>foo
foo您提供的版本是相似的。
$ PASSWORD='foobar'
$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
fobar <PASSWORD>但是,如果原始密码包含|、\、$、@、+、*、?、^、D19、D20、D21、D22、D23、D24和可能的其他字符,则您提供的版本中的code injection错误会以各种方式导致失败。
$ PASSWORD='foo|bar'
$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
syntax error at -e line 1, near "PASSWORD>"
Execution of -e aborted due to compilation errors.
$ PASSWORD='foo*bar'
$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
<PASSWORD> foo*bar
$ PASSWORD='$x[exec("echo hacked")]'
$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
hacked发布于 2019-05-10 11:08:53
-p选项创建一个包含-e内容的while循环。对于这个特殊的问题,假设是PASSWORD=xxx,下面是生成的代码:
LINE:
while (<>) {
s|xxx|<PASSWORD>|g
} continue {
print or die "-p destination: $!\n";
}正如其他人所指出的,$PASSWORD可能会被shell替换为env变量"PASSWORD“的值,而不是perl代码中的变量。我把"xxx“放在那里只是为了演示这一点。
要了解更多信息,请访问:https://perldoc.pl/perlrun#-p (或man perlrun)
"perlrun“文档还解释了"perl”命令的各个选项。
发布于 2019-05-09 19:17:27
它处理STDIN上的所有行,并用<PASSWORD>占位符替换PASSWORD环境变量的值。
你可以用这个最小的例子来尝试一下:
export PASSWORD=secret_password
echo "My password is: secret_password" | perl -pe "s|$PASSWORD|<PASSWORD>|g"输出为:
My password is: <PASSWORD>https://stackoverflow.com/questions/56057998
复制相似问题