0

我继承了这个脚本,其中一些敏感信息存储在数据库中......我想********在它被保存并显示在日志中之前替换它。

我正在使用 PHP...敏感信息是一组随机生成的字符,例如:(yYng6Ytzh有时它还可能包括!和@)。

它总是跟随特定的子字符串Password: eg:Password: yYng6Ytzh并且被存储在单个字符串中的其他文本包围。

例如:

$EmailContent 'Dear Some Name,

here is your password
...or click the link to login... 
someurl.com?action=Log%20In&username=someuser@test.com&…
Your log in details are:
Username: your full email address (where this email was received)
Password: yYng6Ytzh
Some more bla bla

Kind Regards,
Admin

我一直在尝试各种组合preg_match()preg_replace()包括str_replace ()偏移量,但我没有得到任何结果。

谁能指出我正确的方向?

4

3 回答 3

1

您可以匹配密码,然后使用后视检查“ Password:”是否在其前面:

/(?<=Password:)\s*[a-zA-Z0-9!@]+/

编辑:我不得不将量词移到后视之外。这意味着您需要在使用前对匹配进行左修剪。

您也可以使用命名组来匹配它。更干净一点,imo。

/(?<=Password:)\s*(?P<password>[a-zA-Z0-9!@]+)/
于 2015-01-26T12:48:02.420 回答
0

你可以试试这个解决方案:

$string = preg_replace_callback('#(?<=Password: )([^ ]+)#', function($match) {
                                                                return str_repeat('*', strlen($match[1]));
                                                            }, 'Password: yYng6Ytzh');

var_dump($string);
于 2015-01-26T12:54:55.117 回答
0

不仅要编辑密码,而且还要将原始密码的长度与替换文本的长度分开,这将是一个好主意。我不会使用星号,而是使用[redacted]. 虽然您知道有一个可预测的字符范围(字母数字加@!),但我认为保持正则表达式的那部分超紧没有任何优势。使用非空白字符\S可以很好地保持模式小。而不是使用环视或捕获组,只需使用\K忘记匹配的Password: 子字符串。

代码:(演示

$email = <<<TEXT
Dear Some Name,
here is your password
...or click the link to login... someurl.com?action=Log%20In&username=someuser@test.com&…
Your log in details are:
Username: your full email address (where this email was received)
Password: yYng6Ytzh Some more bla bla Kind Regards, Admin
TEXT;

echo preg_replace('~Password: \K\S+~', '[redacted]', $email);

输出:

Dear Some Name,
here is your password
...or click the link to login... someurl.com?action=Log%20In&username=someuser@test.com&…
Your log in details are:
Username: your full email address (where this email was received)
Password: [redacted] Some more bla bla Kind Regards, Admin
于 2020-10-20T12:30:59.370 回答