我有一个记录登录的api日志系统,但我不想在日志中存储密码。
这是一个日志请求字符串的例子:
注意:字符串将不完全相同,将包含不同顺序的参数,所以我想也许someeregex可以处理这个?
api.my.geatapim/live/?action=login_user&username=joe@bloggs.com&password=PassWord&session_length=10080
我需要做的是:
- 检测参数"password="是否在字符串 中
- 如果它在字符串中,将密码部分替换为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