可解析带有分隔符的 NGINX 访问日志文件

可解析带有分隔符的 NGINX 访问日志文件

默认的 NGINX 格式是这样的:

log_format combined '$remote_addr - $remote_user [$time_local]  '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent"';

这有点难以解析。我担心有人会注入"请求、引荐来源或用户代理。

我曾考虑过使用分隔符,并使用我自己的格式,用作|P-,|分隔符:

log_format parsable '$status |P-,| $time_iso8601 |P-,| $http_host 
|P-,| $bytes_sent |P-,| $http_user_agent |P-,| $http_referer 
|P-,| $request_time |P-,| $request';

但是,没有什么可以阻止用户注入|P-,|他们的请求、引荐来源或用户代理。

我读了这篇关于 ASCII 分隔文本的文章:https://ronaldduncan.wordpress.com/2009/10/31/text-file-formats-ascii-delimited-text-not-csv-or-tab-delimited-text/

我认为这可以用来解决这个问题,但用户也可以将 ASCII 分隔符注入到他们的数据中。

有没有解决这个问题的最佳实践方法?

答案1

没有问题。

我担心人们会注入"请求、引荐来源或用户代理。

"表示为\x22

要求:

$ curl 'localhost/"?"="' --header 'User-Agent: "'

日志中的行:

[27/Mar/2014:16:14:42 +0400] localhost 127.0.0.1 "GET /\x22?\x22=\x22 HTTP/1.1" 200 "-" "\x22" "-" "/index.html"

更新

来自 nginx 更新日志

nginx 1.1.6 的变化 2011 年 10 月 17 日

*) Change: now the 0x7F-0x1F characters are escaped as \xXX in an
   access_log.

nginx 0.7.0 的变化 2008 年 5 月 19 日

*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
   in an access_log.
   Thanks to Maxim Dounin.

答案2

请记住,许多字段都是由系统生成的,因此是安全的。如果您确保这些字段在左侧,而可破解的字段在右侧(http_user_agent 应该在最后,http_referer 应该在它之前,request 应该在它之前),您可以确保大多数数据是可靠的,并且通过向解析器添加比可能存在但无需插入的更多分隔符(最右侧的可选分隔符),您的解析器将检测到已插入的记录。

此外,我重新开始使用制表符作为分隔符,因为我相信如果有人试图将其插入到 URL 中,它最终会被转义为 %09

相关内容