2012-02-27 74 views
4

我需要排除我的apache日誌中的一些敏感細節,但我想保留日誌和uri的。是否有可能實現我的訪問日誌如下:是否可以在apache訪問日誌中排除指定的GET參數?

127.0.0.1 - - [27/Feb/2012:13:18:12 +0100] "GET /api.php?param=secret HTTP/1.1" 200 7600 "http://localhost/api.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11" 

我要替換「祕密」與「[FILTERED]」像這樣:

127.0.0.1 - - [27/Feb/2012:13:18:12 +0100] "GET /api.php?param=[FILTERED] HTTP/1.1" 200 7600 "http://localhost/api.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11" 

我知道,我也許應該使用POST來發送這個變量,但傷害已經完成。我看過http://httpd.apache.org/docs/2.4/logs.html和LogFormat,但找不到使用正則表達式或類似的任何可能性。有什麼建議麼?

[編輯]

不要發送敏感變量作爲GET參數,如果你要選擇的可能性。

回答

8

我找到了解決問題的方法之一。如果我將日誌輸出傳送到sed,我可以在將輸出附加到日誌文件之前對輸出執行正則表達式替換。

實施例1

CustomLog "|/bin/sed -E s/'param=[^& \t\n]*'/'param=\[FILTERED\]'/g >> /your/path/access.log" combined 

實施例2

它也能夠排除幾個參數:

exclude.sh

#!/bin/bash 
while read x ; do 
    result=$x 
    for ARG in "[email protected]" 
    do 
     cleanArg=`echo $ARG | sed -E 's|([^0-9a-zA-Z_])|\\\\\1|g'` 
     result=`echo $result | sed -E s/$cleanArg'=[^& \t\n]*'/$cleanArg'=\[FILTERED\]'/g` 
    done 
    echo $result 
done 

移動上面夾/ opt /腳本/或其他地方的腳本,給腳本執行權限(chmod +x exclude.sh)和修改Apache的配置是這樣的:

CustomLog "|/opt/scripts/exclude.sh param param1 param2 >> /your/path/access.log" combined 

文檔

http://httpd.apache.org/docs/2.4/logs.html#piped

http://www.gnu.org/software/sed/manual/sed.html

+0

當我嘗試同樣的事情時,出現「/ bin/sed:can not read >>錯誤:沒有這樣的文件或目錄」。你也看到了嗎? – PlagueHammer 2015-03-11 20:54:07

+0

你是否改變了現有文件的路徑? '/your/path/access.log' – kvaale 2015-03-16 12:36:22

+0

不幸的是,這並不適用於我。它在使用這個腳本時不記錄任何東西...... – Tarator 2017-09-23 12:08:01