想象一下,您有一个站点 API,它以带有参数的 GET 请求或 POST 请求(例如,使用标准 url 编码、& 分隔的 POST 数据)的形式接受数据。如果你想记录和分析 API 调用,GET 请求会很容易,因为它们会在 apache 日志中。是否也有一种简单的方法可以在 apache 日志中获取 POST 数据?
(当然,我们可以在应用程序中显式记录 POST 数据,但我希望有一种配置级别的方式,让我不用担心代码中的问题。)
想象一下,您有一个站点 API,它以带有参数的 GET 请求或 POST 请求(例如,使用标准 url 编码、& 分隔的 POST 数据)的形式接受数据。如果你想记录和分析 API 调用,GET 请求会很容易,因为它们会在 apache 日志中。是否也有一种简单的方法可以在 apache 日志中获取 POST 数据?
(当然,我们可以在应用程序中显式记录 POST 数据,但我希望有一种配置级别的方式,让我不用担心代码中的问题。)
使用 Apache 的mod_dumpio。出于明显的原因要小心。
请注意,mod_dumpio在第一个空字符处停止记录二进制有效负载。例如,multipart/form-data
上传 gzip 文件可能只会显示带有 mod_dumpio 的前几个字节。
另请注意,httpd.conf
即使它存在于/modules
文件夹中,Apache 也可能不会提及此模块。只需手动添加LoadModule
即可。
您可以安装mod_security
并放入/etc/modsecurity/modsecurity.conf
:
SecRuleEngine On
SecAuditEngine On
SecAuditLog /var/log/apache2/modsec_audit.log
SecRequestBodyAccess on
SecAuditLogParts ABIJDFHZ
虽然回答晚了。这个模块可以做:https ://github.com/danghvu/mod_dumpost
您可以[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"}
不完全是答案,但我从未听说过在 Apache 本身中执行此操作的方法。我想扩展模块可能是可能的,但我不知道是否已经编写了一个。
一个问题是 POST 数据可能非常大,如果您不对记录的数量设置某种限制,那么一段时间后您可能会用完磁盘空间。这是黑客弄乱您的服务器的可能途径。
实际上,我会在应用程序中这样做。当然,它仍然可以在运行时进行配置,具体取决于您的记录器系统。例如,如果您使用 Apache Log (log4j/cxx),您可以为此类 URL 配置专用记录器,然后在运行时从 XML 文件配置它。
一个更简单的选择可能是在 POST 数据到达服务器之前记录它。对于 Web 应用程序,我使用Burp Proxy并将 Firefox 设置为将其用作 HTTP/S 代理,然后我可以实时“在线”观看(和处理)数据。
对于在没有浏览器的情况下发出 API 请求,SoapUI 非常有用,并且可能会显示类似的信息。我敢打赌,您可能也可以将 SoapUI 配置为通过 Burp 进行连接(尽管只是猜测)。
您还可以使用 mod DumpIO,激活它,然后从您的 Apache Log Conf 加载。将日志名称定义为 postdata 名称,并加载到 AccessLog 语句
#AccessLog /path/to/your/log/abc.access.log 结合
AccessLog /path/to/your/log/abc.access.log postdata
您还可以使用内置的取证日志功能。