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

Posted

技术标签:

【中文标题】在 Apache 中记录 POST 数据的最佳方式?【英文标题】:Best way to log POST data in Apache? 【发布时间】:2010-11-02 15:54:00 【问题描述】:

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

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

【问题讨论】:

ServerFault 的相关问题:serverfault.com/questions/51295/logging-http-post-in-apache 【参考方案1】:

使用 Apache 的mod_dumpio。出于明显的原因要小心。

注意 mod_dumpio stops logging binary payloads at the first null character。例如,multipart/form-data 上传 gzip 文件可能只会显示带有 mod_dumpio 的前几个字节。

另请注意,Apache 可能不会在 httpd.conf 中提及此模块,即使它存在于 /modules 文件夹中。只需手动添加LoadModule 即可。

【讨论】:

mod_dumpio 听起来不像是可以限制在特定的位置上下文,它只是服务器范围的 @JosipRodin 应该可以通过 LogLevel (也可以在 vhost 或 dir 上下文中设置)。 另外,mod_dumpio需要配置为LogLevel trace7【参考方案2】:

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

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

【讨论】:

modsecurity 有 Ubuntu 软件包,而其他没有。 还有什么?喜欢dumpio?它已经包含在 Apache HTTPD 中——至少在 Ubuntu 16.04 中。这就是为什么没有单独的包装。您只需要启用它。 对于http 2.4,yum 包是mod24_security,配置文件位置是/etc/httpd/conf.d/mod_security.conf dumpio 看起来仅限于正文的前 256 个字节,然后截断其余部分。【参考方案3】:

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

【讨论】:

酷!转储用于日志文件分析的帖子数据是绝对有意义的,即用于 sql 注入尝试之类的事情。【参考方案4】:

您可以使用[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"

【讨论】:

【参考方案5】:

不完全是答案,但我从未听说过在 Apache 本身中执行此操作的方法。我想扩展模块可能是可能的,但我不知道是否已经编写了一个。

一个问题是 POST 数据可能非常大,如果您不对记录的数据量设置某种限制,一段时间后您可能会用完磁盘空间。这是黑客入侵您的服务器的可能途径。

【讨论】:

我完全同意后半部分!由于 POST 数据没有限制,它可以包括各种数据,包括您不想存储在日志中的密码。日志中可能还有其他您不想要的安全和大型数据。 记录密码不是问题,反正您不会以纯文本形式发送密码,是吗? @supo:即使密码通过 SSL 加密,它们仍然会以纯文本形式记录。但我要解决的特别问题是填满你的磁盘空间,而不是在日志中暴露密码。 @supo wordpress 不会以纯格式发送它们吗?那么如何加密呢?使用 javascript 加密?【参考方案6】:

实际上,我会在应用程序中执行此操作。当然,它仍然可以在运行时进行配置,具体取决于您的记录器系统。例如,如果您使用 Apache Log (log4j/cxx),您可以为此类 URL 配置专用记录器,然后在运行时从 XML 文件进行配置。

【讨论】:

我担心的是,每个 api 处理程序都必须在开始时记录数据——添加时很容易忘记,充其量只是添加样板。 任何好的框架都应该有前置过滤器和后置过滤器,或者相当于中间件,可以让你一劳永逸。【参考方案7】:

一个更简单的选择可能是在 POST 数据到达服务器之前记录它。对于 Web 应用程序,我使用 Burp Proxy 并将 Firefox 设置为将其用作 HTTP/S 代理,然后我可以实时“在线”观看(和破坏)数据。

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

【讨论】:

【参考方案8】:

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

#AccessLog /path/to/your/log/abc.access.log 结合

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

【讨论】:

【参考方案9】:

您还可以使用内置的取证日志功能。

【讨论】:

我没有看到有人要求 mod_log_forensic 记录 POST 数据。我错过了什么吗? httpd.apache.org/docs/2.4/mod/mod_log_forensic.html#forensiclog 表示这个模块只能和虚拟主机一样粒度 取证日志不记录内容

以上是关于在 Apache 中记录 POST 数据的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

ETL 处理中日志记录机制的最佳实践

php面试题-1

通过 REST 发送大量数据 - 最佳实践

OS X 应用程序。存储数据的最佳方式是啥?

SQL Server 1B+ 记录表 - 处理 upserts 的最佳方式?

使用 Web 表单通过 HTTP POST 上传文件的最佳方式是啥?