Назад | Перейти на главную страницу

Разбираемые файлы журналов доступа 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 в свои данные.

Есть ли лучший способ решить эту проблему?

Нет проблем.

Боюсь, что люди колют " либо в запросах, либо в реферерах, либо в пользовательских агентах.

" представлен как \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 17.10.2011

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

Изменения в nginx 0.7.0 19.05.2008

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

Помните, что некоторые поля генерируются системой, поэтому они безопасны. Если вы убедитесь, что эти поля находятся слева, а взломанные - справа (http_user_agent должен быть в конце, а http_referer перед этим, запрос должен быть перед этим), вы можете гарантировать, что большая часть данных верна, и добавив больше разделителей для синтаксического анализатора (необязательный справа), чем может существовать без вставки, тогда ваш синтаксический анализатор обнаружит записи, которые были подвергнуты вставке.

Также я возобновил использование символа табуляции в качестве разделителя, так как я считаю, что если бы кто-то попытался вставить его в URL-адрес, он бы в конечном итоге был экранирован на% 09