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


PHP: Detect password parameter in string and replace with default text

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

这是一个日志请求字符串的例子:

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

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

我需要做的是:

  1. 检测参数"password="是否在字符串
  2. 如果它在字符串中,将密码部分替换为OBFUSCATED,这样结果将是:

api.my.geatapim/生活/? action = login_user&用户名= joe@bloggs.com&密码= OBFUSCATED& session_length = 10080

我已经尝试过了,但不工作:$request_string = preg_replace("/password='d+/", "password=OBFUSCATED", $request_string);

'd+表示数字([0-9])。考虑到您提供的密码使用的是[A-Za-z],您将需要为密码包含更多的字符集。

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

虽然,考虑到特殊字符,典型的密码将具有比[a-zA-Z0-9_]更大的字符集(但由于它在URL中,它可能是urlencoded() 'd。例如,P&ssW0rd!将成为P%26ssW0rd!。)

$request_string = preg_replace("/password=[^&]+/", "password=OBFUSCATED", $request_string);

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

这个逻辑不会修改你的Apache/Nginx/任何access_log(除非你把这些日志写到/dev/null或其他空白的地方)。如果您将其从HTTP GET更改为HTTP POST(或HTTP PUT),并且在主体中具有凭据,则可以不写入日志中的密码,使用HTTP身份验证头

虽然你的问题很容易解决,但它与你的实际问题毫无关系。你绝对不应该通过$_GET传输密码数据——这是处理凭证的一大禁忌。本;弗朗茨Gleichmann

试试这段代码,它可以工作

<?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&username=joe@bloggs.com&password=OBFUSCATED&session_length=10080