代码之家  ›  专栏  ›  技术社区  ›  bohr

preg\U replace删除行的其余部分

  •  0
  • bohr  · 技术社区  · 7 年前

    我面临preg\u replace()的问题,我不理解:

    我正在尝试从应用程序级日志中删除密码、令牌和其他敏感数据。为了实现这一点,我使用以下方法:

    $content = preg_replace(
            '/(?=\\\\"password\\\\")(.*)(?=\\\")(.*)/i', '\"password\": \"[OBFUSCATED]\",',
            $content
        );
    

    它可以很好地与此字符串配合使用:

    “{\n \”用户名\“:\”myuser@gmail.com\“,\n”
    \“密码\”:“1234密码\”,\n \“role\”:“role\u USER\”,\n
    }"

    还有像这样的正则表达式生成器: http://www.phpliveregex.com/

    但当我在应用程序中使用它时,它只会输出以下内容:

    "{\n  \"username\": \"myuser@gmail.com\",\n  \"password\": \"[OBFUSCATED]\",
    

    而不是预期的:

    "{\n  \"username\": \"myuser@gmail.com\",\n  \"password\": \"[OBFUSCATED]\", \"role\": \"ROLE_USER\",\n }"
    

    更换零件后,它会移除剩余的管路。我不明白为什么,我对regex很糟糕。。。 我如何保持该行的其余部分,为什么它在regex构建器上工作,而不在我的应用程序(PHP v7.0.15)中工作?

    编辑:正如我在@Splash58评论上看到的Upvows: 我无法使用数组,因为我无法提前看到需要混淆的值在哪里。它可以是$json['object1']['object2']['password']或$json['objectX'][0]['password']。我不想在我的数组中搜索要在可能的拥抱数组中删除的密钥,性能太差了。这更清楚吗?

    谢谢你的提示! 博尔

    2 回复  |  直到 7 年前
        1
  •  1
  •   trincot Jakube    7 年前

    不建议在此类字符串上使用regex,但您的regex有一些明显的问题:

    • 它表现得很贪婪 . 匹配,这样您就有可能匹配不属于一起的引号对。它还解释了您提到的问题,即删除了字符串的其余部分。
    • (?= ) 以错误的方式使用:这代表了一种前瞻性 实际上并没有抓住 这些字符,而在您的用例中,可以实际获取它们(性能更好)
    • 为了避免其他不匹配,最好还:
      • 检查是否存在冒号和空格,因为密码属性的键/值对之间不应出现任何其他内容。
      • 检查字符串文字是否只有非引号的反斜杠转义,否则它表示字符串文字的结尾。

    下面是修改后的表达式:

    $content = preg_replace(
            '/(\\\\"password\\\\"\s*:\s*\\\\")((\\\\[^"]|[^\\\\])*)/i',
            '$1[OBFUSCATED]',
            $content
        );
    

    请注意,您的输入字符串不是JSON,因为真正的JSON不允许在您有文本反斜杠的地方出现文本反斜杠。例如,它不能有文本 \n 其中只允许空白。看起来您对某些字符(换行符、引号)进行了转义,而在JSON中,这些字符不应该这样转义。

        2
  •  -1
  •   Niet the Dark Absol    7 年前

    要解决根本问题,您应该 从来没有 让敏感数据像这样在应用程序中四处浮动。

    至少 您应该只有一个密码哈希(即由 password_hash )被传来传去,但即使如此,也只是为了实际验证用户。不要把那些东西放在内存中超过需要!

    一旦解决了根本问题,即在不需要的地方拥有不安全的敏感数据,您将发现不再需要“清理”应用程序日志:)