我需要排除 apache 日志中的一些敏感详细信息,但我想保留日志和其中的 uri。是否可以在我的访问日志中实现以下目标:
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]”替换“ secret ”,如下所示:
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 参数发送。
最佳答案
我找到了解决这个问题的方法。如果我将日志输出通过管道传输到 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 "$@"
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/scripts/或其他位置,赋予脚本执行权限(chmod +x exclu.sh
)并修改您的 apache 配置,如下所示:
CustomLog "|/opt/scripts/exclude.sh param param1 param2 >> /your/path/access.log" combined
文档
关于regex - 是否可以排除 apache 访问日志中指定的 GET 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9467405/