在處理日誌文件時,我們經常會遇到需要對敏感信息進行脫敏的情況,比如用戶的IP 地址、身份驗證token 等。這些信息如果未經處理就直接存儲或輸出,可能會引起隱私和安全問題。
PHP 提供了多種字符串處理函數,而其中mb_eregi_replace是一個多字節安全的函數,它支持正則表達式替換,同時支持Unicode 字符集,特別適用於包含中文等多字節字符的內容處理。
本文將介紹如何使用mb_eregi_replace來查找和替換日誌內容中的IP 地址和token 字符串。
假設我們有以下日誌片段:
[2025-05-27 10:00:00] User login from 192.168.1.100 with token abc123xyz
[2025-05-27 10:05:00] Failed login from 10.0.0.5 with token 9f8d7e6c5b
我們希望將其中的IP 地址和token 替換為[REDACTED_IP]和[REDACTED_TOKEN] 。
PHP 的mb_eregi_replace函數使用方式如下:
string mb_eregi_replace ( string $pattern , string $replace , string $string [, string $option = "msr" ] )
下面是一個完整的示例腳本,用來處理日誌內容:
<?php
// 模擬讀取日誌內容
$log = <<<LOG
[2025-05-27 10:00:00] User login from 192.168.1.100 with token abc123xyz
[2025-05-27 10:05:00] Failed login from 10.0.0.5 with token 9f8d7e6c5b
LOG;
// 正則匹配 IPv4 地址
$pattern_ip = '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b';
// 正則匹配 token(假設為由字母和數字組成的長度 8 到 32)
$pattern_token = '\b[a-zA-Z0-9]{8,32}\b';
// 替換 IP 地址
$log = mb_eregi_replace($pattern_ip, '[REDACTED_IP]', $log);
// 替換 token,注意避免誤傷時間戳中的數字
$log = mb_eregi_replace('with token ' . $pattern_token, 'with token [REDACTED_TOKEN]', $log);
// 輸出結果
echo nl2br(htmlspecialchars($log));
?>
輸出將如下所示:
[2025-05-27 10:00:00] User login from [REDACTED_IP] with token [REDACTED_TOKEN]
[2025-05-27 10:05:00] Failed login from [REDACTED_IP] with token [REDACTED_TOKEN]
在實際項目中,我們通常不會直接對原始日誌文件進行操作,而是通過日誌讀取和轉儲流程中對內容做處理。比如你可以將上述邏輯封裝為一個函數,然後用於日誌展示頁面:
function sanitize_log($logContent) {
$pattern_ip = '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b';
$pattern_token = '\b[a-zA-Z0-9]{8,32}\b';
$logContent = mb_eregi_replace($pattern_ip, '[REDACTED_IP]', $logContent);
$logContent = mb_eregi_replace('with token ' . $pattern_token, 'with token [REDACTED_TOKEN]', $logContent);
return $logContent;
}
// 舉例調用
$rawLog = file_get_contents("https://m66.net/logs/example.log");
echo nl2br(htmlspecialchars(sanitize_log($rawLog)));
mb_eregi_replace提供了一種簡潔而高效的方式來處理含有敏感信息的日誌內容。通過合理的正則表達式匹配,可以靈活替換IP、token 等關鍵數據,保護用戶隱私,並確保日誌對開發和運維依然有用。
使用時要注意:
保證替換模式不會誤傷其他合法數據。
注意mb_eregi_replace是大小寫不敏感的,如需區分大小寫可使用mb_ereg_replace 。
PHP 8.0 之後該函數可能不再推薦使用,建議使用PCRE 系列函數配合preg_replace ,但在簡單腳本中它依然方便實用。