regex - 是否可以排除 apache 访问日志中指定的 GET 参数?

标签 regex apache logging

我需要排除 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

文档

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

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

关于regex - 是否可以排除 apache 访问日志中指定的 GET 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9467405/

相关文章:

java - 在日志文件中打印调试消息

Java正则表达式拆分字符串

javascript 正则表达式来指示字符串开头不需要的数字

javascript - 正则表达式:匹配直到第一次出现

php 的 set_time_limit(0) 挂起并抛出 HTTP 500

java - 是否有记录用户操作以帮助重现错误的工具?

python - 找不到记录器的处理程序

PHP 正则表达式检查是否包含特定单词但不包含另一个单词

java - HttpClient 连接被对等方重置 : socket write error

spring - NoClassDefFound错误: org/apache/commons/pool/KeyedObjectPoolFactory BasicDataSource Spring