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

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

2 ответа

Решение

Нет проблем.

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

" представляется как \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 октября 2011

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

Изменения в nginx 0.7.0 19 мая 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

Другие вопросы по тегам