Apache-2.2

apache 2.2x 的製表符分隔 Logformat 的潛在問題?

  • October 20, 2010

我的雇主有一個 CustomLog 管道處理程序,它可以將靜態 Web 內容機器訪問日誌減少並準備成一種格式,以便被轉儲到 hadoop/hive 中。不幸的是,它依賴於一個正則表達式來轉換日誌格式以及一些複雜的邏輯來處理網際網路可以拋出的最糟糕的情況。

修復方法是替換目前腳本並使整個管道更加持久。我的一個想法是取消正則表達式部分並執行以下操作:

LogFormat "%v:%p\t%h\t%l\t%u\t%t\t\"%r\"\t%>s\t%O\t\"%{Referer}i\"\t\"%{User-Agent}i\"" vhost_combined_tabs

訣竅是每個欄位都是製表符分隔的。因此,在腳本語言中,“\t”上的簡單拆分可以可靠地破壞訪問日誌。即使其中一個欄位返回為“”,該選項卡也將保持記錄完整性。

問題是,我在Google上找不到任何提到這樣做的東西。對我來說,從源頭分解工作而不是讓腳本處理問題似乎很直覺。我在這裡錯過了什麼嗎?

我認為您沒有遺漏任何內容,明顯的問題是沒有任何未引用的數據欄位必須有任何可能包含分隔符。如果任何引用的數據欄位可能包含您的分隔符,那麼您將不得不使用效率較低的方法來分隔這些欄位。

標籤應該是相對安全的

請注意,在 2.0.46 之前的 httpd 2.0 版本中,沒有對來自 %…r、%…i 和 %…o 的字元串執行轉義。這主要是為了符合通用日誌格式的要求。這意味著客戶端可以在日誌中插入控製字元,因此在處理原始日誌文件時必須非常小心。

出於安全原因,從 2.0.46 開始,不可列印和其他特殊字元主要使用 \xhh 序列進行轉義,其中 hh 代表原始字節的十六進製表示。此規則的例外是 " 和 \,它們通過在前面加上反斜杠進行轉義,以及所有以其 C 樣式表示法(\n、\t 等)編寫的空白字元。

http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats

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