Nginx

帶有分隔符的可解析 NGINX 訪問日誌文件

  • March 27, 2014

預設的 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 分隔符注入他們的數據中。

是否有解決此問題的最佳實踐方法?

沒有問題。

恐怕人們會注入"請求、推薦人或使用者代理。

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

引用自:https://serverfault.com/questions/584881