PHP:检测字符串中的密码参数并替换为默认文本

时间:2016-10-20 12:02:05

标签: php

我有一个记录登录的api记录系统,但我不想在日志中存储密码。

这是日志的请求字符串示例:

注意:字符串不会完全相同,并且将包含不同顺序的参数,所以我想也许某些REGEX可以处理这个?

api.my.geatapim/live/?action=login_user&username=joe@bloggs.com&password=PassWord&session_length=10080

我需要做的是:

  1. 检测参数“password =”是否在字符串
  2. 如果它在字符串中用OBFUSCATED替换密码部分,那么结果将是:
  3. api.my.geatapim /活/动作= login_user&安培; username=joe@bloggs.com&密码=混淆&安培; session_length = 10080

    我试过这个但不起作用:$request_string = preg_replace("/password=\d+/", "password=OBFUSCATED", $request_string);

2 个答案:

答案 0 :(得分:1)

表达式

\d+代表数字([0-9])。考虑到您提供的字符集使用[A-Za-z],您希望为密码添加更多字符集。

$request_string = preg_replace("/password=\w+/", "password=OBFUSCATED", $request_string);

但是,考虑到典型的密码,其字符集将大于[a-zA-Z0-9_],考虑到特殊字符(但由于它在网址中,它可能是{{1} }例如,urlencoded()将成为P&ssW0rd!。)

P%26ssW0rd!

"我不想在日志中存储密码。"

这个逻辑不会修改放入Apache / Nginx / Whatever $request_string = preg_replace("/password=[^&]+/", "password=OBFUSCATED", $request_string); 的内容(除非您将这些日志写入access_log或其他空白位置)。如果您将密码从/dev/null更改为HTTP GET(或HTTP POST)并在正文中包含凭据,,使用HTTP Authentication headers

  

虽然您的问题很容易解决,但它与您的实际问题无关。你永远不应该通过HTTP PUT转移密码数据 - 它是处理凭据的重要原因之一。 - Franz Gleichmann

答案 1 :(得分:0)

尝试使用此代码,它可以正常工作

<?php

$request_string = "api.my.geatapim/live/?action=login_user&username=joe@bloggs.com&password=PassWord&session_length=10080";
echo $request_string = preg_replace("/password=\w+/", "password=OBFUSCATED", $request_string);
?>

输出:api.my.geatapim / live /?action = login_user&amp; username=joe@bloggs.com& password = OBFUSCATED&amp; session_length = 10080