在 Apache 中记录 POST 数据的最佳方式?

假设您有一个站点 API,它接受带有参数的 GET 请求形式的数据,或者接受 POST 请求形式的数据(比如,使用标准的 url 编码的 &-分隔的 POST 数据)。如果您想要记录和分析 API 调用,GET 请求将很容易,因为它们将在 apache 日志中。有没有一种简单的方法来获取 apache 日志中的 POST 数据?

(当然,我们可以在应用程序中显式地记录 POST 数据,但是我希望有一种配置级别的方式,让我不必在代码中担心这个问题。)

154847 次浏览

实际上,我会在申请表上写。当然,它在运行时仍然是可配置的,这取决于您的日志系统。例如,如果您使用 Apache 日志(log4j/cxx) ,您可以为这样的 URL 配置一个专用的日志记录器,然后在运行时从一个 XML 文件进行配置。

这不是一个确切的答案,但是我从来没有听说过在 Apache 中有这样的方法。我想这可能与一个扩展模块,但我不知道是否已经编写了一个。

一个问题是 POST 数据可能非常大,如果不对日志记录的数量进行某种限制,过一段时间后可能会耗尽磁盘空间。这可能是黑客破坏服务器的一条途径。

使用 Apache 的 翻译: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳。出于显而易见的原因要小心。

请注意,mod _ Dumpio 在第一个空字符处停止记录二进制有效负载。例如,gzip 文件的 multipart/form-data上传可能只显示 mod _ dump 的前几个字节。

还要注意,Apache 可能不会在 httpd.conf中提到这个模块,即使它出现在 /modules文件夹中。只要手动添加 LoadModule就可以了。

虽然现在回答已经晚了。这个模块可以做: https://github.com/danghvu/mod_dumpost

一个更简单的选择可能是在 POST 数据到达服务器之前对其进行日志记录。对于 web 应用程序,我使用 打嗝代理并设置 Firefox 作为 HTTP/S 代理使用它,然后我就可以实时观察(并破坏)线上的数据。

对于在没有浏览器的情况下发出 API 请求,SoapUI 非常有用,可能会显示类似的信息。我敢打赌,您也可以将 SoapUI 配置为通过 Burp 进行连接(尽管只是猜测)。

你可以安装 mod_security并输入 /etc/modsecurity/modsecurity.conf:

SecRuleEngine On
SecAuditEngine On
SecAuditLog /var/log/apache2/modsec_audit.log
SecRequestBodyAccess on
SecAuditLogParts ABIJDFHZ

可以使用 [ModSecurity][1]查看 POST 数据。

安装在 Debian/Ubuntu 上:

$ sudo apt install libapache2-mod-security2

使用推荐的配置文件:

$ sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

重新装载 Apache:

$ sudo service apache2 reload

您现在可以找到在 /var/log/apache2/modsec_audit.log下记录的数据

$ tail -f /var/log/apache2/modsec_audit.log
--2222229-A--
[23/Nov/2017:11:36:35 +0000]
--2222229-B--
POST / HTTP/1.1
Content-Type: application/json
User-Agent: curl
Host: example.com


--2222229-C--
{"test":"modsecurity"}

您还可以使用内置的法医日志特性。

您还可以使用 mod DumplO,激活它,并从 Apache 日志 Conf 中加载。将日志名称定义为 postdata 名称,并加载到 AccessLog 语句

# AccessLog/path/to/your/log/abc.acc.log 组合

AccessLog/path/to/your/log/abc.acc.log postdata

启用 mod _ dump

  • 基于 Debian 的操作系统

    Sudo a2enmod dump _ io

  • 基于 RedHat 的操作系统

    无需做任何事情,它是默认启用的

将 mod _ dump 添加到虚拟主机配置中

<VirtualHost *:8080>
ServerName  localhost


ErrorLog "/var/log/httpd/error.log"
CustomLog "/var/log/httpd/access.log" combined


DumpIOInput On
DumpIOOutput On
LogLevel dumpio:trace7
</VirtualHost>

重启阿帕奇