我需要创建一个“模糊”功能,在将其写入日志之前替换明文密码。
看起来像这样:
function pass_obscure {
my $logline = shift;
my $pass = "wer32pass$"; # This password is an example. The real one is received as a parameter, or already stored as a global value.
$logline =~ s/$pass/*********/g;
return $logline;
}
但是,这当然不起作用。密码字符串中的“$”符号被内插为结束字符,因此没有匹配,因此替换不起作用。
我该如何解决这个问题?
答案 0 :(得分:7)
(为什么不首先将密码保留在日志行之外?)
使用quotemeta
:
$pass = "password\$";
$logline = "password is: password\$";
print "$pass\n";
print "$logline\n";
$pass_quoted = quotemeta($pass);
$logline =~ s/$pass_quoted/********/g;
print "$logline\n";
输出:
password$
password is: password$
password is: ********
答案 1 :(得分:2)
在插值字符串中,
\Q
→quotemeta
\L
→lc
\l
→lcfirst
\U
→uc
\u
→ucfirst
\E
→案例/引用修饰符的结尾
因此,这也是一种解决方案。
$logline =~ s/\Q$pass/********/g;
答案 2 :(得分:0)
解决方案当然是使用:
my $pattern = quotemeta $pass;
$logline =~ s/$pattern/********/g;