如何编辑特定子字符串后的敏感子字符串?
How to redact sensitive substring following a specific substring?
我继承了这个脚本,其中一些敏感信息存储在数据库中...我想在它被保存并显示在日志中之前用 ********
替换它。
我正在使用 PHP...敏感信息是一组随机生成的字符,例如:yYng6Ytzh
(有时它还可能包括 !'s 和 @'s)。
它始终跟在特定的子字符串 Password:
之后,例如: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 ()
,但我没有取得任何进展。
谁能给我指出正确的方向?
您可以匹配密码,然后使用后视检查“Password:
”是否在其前面:
/(?<=Password:)\s*[a-zA-Z0-9!@]+/
编辑:我不得不将量词移到后视之外。这意味着您需要在使用之前离开 trim 匹配项。
您也可以使用命名组来匹配它。它更干净了,imo。
/(?<=Password:)\s*(?P<password>[a-zA-Z0-9!@]+)/
您可以试试这个解决方案:
$string = preg_replace_callback('#(?<=Password: )([^ ]+)#', function($match) {
return str_repeat('*', strlen($match[1]));
}, 'Password: yYng6Ytzh');
var_dump($string);
最好不仅修改密码,而且将原始密码的长度与替换文本的长度分开。我不使用星号,而是使用 [redacted]
。虽然您知道有一个可预测的字符范围(字母数字加上 @
和 !
),但我认为保留正则表达式的那部分 super-tight 没有任何优势。使用 non-whitespace 字符 \S
就可以了,并且可以保持模式较小。不要使用环视或捕获组,只需使用 \K
来忘记匹配的 Password:
子字符串。
代码:(Demo)
$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
我继承了这个脚本,其中一些敏感信息存储在数据库中...我想在它被保存并显示在日志中之前用 ********
替换它。
我正在使用 PHP...敏感信息是一组随机生成的字符,例如:yYng6Ytzh
(有时它还可能包括 !'s 和 @'s)。
它始终跟在特定的子字符串 Password:
之后,例如: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 ()
,但我没有取得任何进展。
谁能给我指出正确的方向?
您可以匹配密码,然后使用后视检查“Password:
”是否在其前面:
/(?<=Password:)\s*[a-zA-Z0-9!@]+/
编辑:我不得不将量词移到后视之外。这意味着您需要在使用之前离开 trim 匹配项。
您也可以使用命名组来匹配它。它更干净了,imo。
/(?<=Password:)\s*(?P<password>[a-zA-Z0-9!@]+)/
您可以试试这个解决方案:
$string = preg_replace_callback('#(?<=Password: )([^ ]+)#', function($match) {
return str_repeat('*', strlen($match[1]));
}, 'Password: yYng6Ytzh');
var_dump($string);
最好不仅修改密码,而且将原始密码的长度与替换文本的长度分开。我不使用星号,而是使用 [redacted]
。虽然您知道有一个可预测的字符范围(字母数字加上 @
和 !
),但我认为保留正则表达式的那部分 super-tight 没有任何优势。使用 non-whitespace 字符 \S
就可以了,并且可以保持模式较小。不要使用环视或捕获组,只需使用 \K
来忘记匹配的 Password:
子字符串。
代码:(Demo)
$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