Формат 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