【问题标题】:How to redact sensitive substring following a specific substring?如何在特定子字符串之后编辑敏感子字符串?
【发布时间】:2015-01-26 12:40:36
【问题描述】:

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

我正在使用 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 (),但我没有得到任何结果。

谁能指点我正确的方向?

【问题讨论】:

  • 密码中可以有空格吗?如果是这样,分隔符是什么?你可以不做替换,只做$strToLog .= "Password: ********";
  • 你能发布一个你想要实现的例子吗?
  • 感谢您的帮助-这是一个示例...基本上,一封电子邮件被发送给用户,邮件正文在一个 $var 中,然后它被存储在数据库中...我'想去掉密码(它不包括空格)但仍然显示完整的电子邮件...有两个地方我想在电子邮件中使用它,但希望调整一个来做另一个...但如果有更简洁的解决方案,我将包括这两个示例。
  • $EmailContent 'Dear Some Name, 这是您的密码...或单击链接登录... someurl.com?action=Log%20In&username=someuser@test.com&… 您的登录详细信息是: 用户名:您的完整电子邮件地址(此电子邮件在哪里已收到)密码:yYng6Ytzh 还有一些 bla bla 亲切的问候,管理员 所以,我希望能够保留邮件的结构......但在它被存储之前,我需要将密码替换为 ***** *** 因为我不能在邮件输出功能上执行此操作...我正在寻找拦截数据库保存功能上的 $EmailContent。

标签: php regex string preg-replace redaction


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这看起来像是赢家!它已经完成了我想要的输出......在我将它移动到保存到通信日志功能之前,我正在测试它......我想知道我是否可以调整它来替换 url 中的密码例如:someurl.com?action=Log%20In&username=someuser@test.com&… 或者我会通过两次吗?
  • 刚刚测试过,这正是我目前需要做的!!!! $aDetails = preg_replace('/(?[a-zA-Z0-9!@]+)/', '*******', $细绳); $aDetails = preg_replace('/(?[a-zA-Z0-9!@]+)/', '*******', $ a详细信息);
【解决方案2】:

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

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

var_dump($string);

【讨论】:

    【解决方案3】:

    最好不仅编辑密码,而且还要将原始密码的长度与替换文本的长度分开。我不会使用星号,而是使用[redacted]。虽然您知道有一个可预测的字符范围(字母数字加上@ 和!),但我认为保持正则表达式的这部分超紧没有任何优势。使用非空白字符 \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
    

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 2022-08-10
      • 2015-08-31
      相关资源
      最近更新 更多