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

默认的NGINX格式是这样的:

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

这有点难以parsing。 我恐怕人们注入"在请求,引荐者或用户代理。

我曾考虑过使用分隔符,并使用我自己的格式,使用|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分隔符。

有没有最好的方法来解决这个问题?

没有问题。

我恐怕人们注入"在请求,引荐者或用户代理。

"表示为\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" 

UPDATE

来自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. 

记住一些字段是由系统生成的,所以是安全的。 如果你确保这些字段在左边,而且可以修改的话(http_user_agent应该在最后,http_referer在那之前请求应该在那之前),你可以确保大部分数据是正确的,并且通过添加parsing器的分隔符(最右边的一个可选的分隔符)比没有插入的情况下可能存在的分隔符多,那么parsing器将检测已经被插入的logging。

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