Задача: не отвечать вообще на явно мусорные запросыВ конфиге прописано
if ($http_user_agent = "") {
return 444;
}if ($http_user_agent = "-") { // на всякий случай
return 444;
}И тем не менее:
139.59.225.6 http://domain.tld - [13/Jul/2021:04:27:10 +0300] "GET / HTTP/1.0" 400 248 "-" "-" 0.000Почему он здесь отвечает 400 ?
Но иногда это срабатывает:
135.125.245.246 https://domain.tld - [08/Jul/2021:03:55:44 +0300] "POST / HTTP/1.1" 444 0 "-" "-" 0.000Я подозреваю, приходит не совсем пустой UA. Пустым его делает nginx при записи в лог.
Похожее с запросами
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 444;
}Но
193.70.3.242 http://domain.tld - [07/Jul/2021:00:28:18 +0300] "\x00\x00\x02\x00" 400 150 "-" "-" 0.044Почему он здесь отвечает 400 ?
>
> Почему он здесь отвечает 400 ?man strlen и думаем над "\x00\x00\x02\x00"
>>
>> Почему он здесь отвечает 400 ?
> man strlen и думаем над "\x00\x00\x02\x00"Спасибо, Капитан! строка "\x00\x00\x02\x00" нулевой длины по strlen, равна "" по strcmp и не входит во множество констант GET|POST|HEAD и, тем не менее, правило не срабатывает.
>>>
>>> Почему он здесь отвечает 400 ?
>> man strlen и думаем над "\x00\x00\x02\x00"
> Спасибо, Капитан! строка "\x00\x00\x02\x00" нулевой длины по strlen, равна "" по strcmp
> и не входит во множество констант GET|POST|HEAD и, тем не менее,
> правило не срабатывает.скорее всего поток управления туда и не доходит, и в моих кодовых базах тоже бы не дошло
1. if (str == NULL || *str='\0') { ихБинПесец( 01 ); return; } // <= САМОЕ БАЗОВОЕ
2. if (!isValidUTF8(str)) { ихБинПесец( 02 ); return; }
3. if (!isAllowedCharset( str, charset )) { ихБинПесец( 03 ); return; }
n. if (!...) { ихБинПесец( n ); return; }Тады копать сорцы на предмет логики обработки и цепочки дeфолтных обработчиков
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 444;
}
> скорее всего поток управления туда и не доходит, и в моих кодовых
> базах тоже бы не дошлоСпасибо, конечно, что вы мне отвечаете, но я не думаю, что nginx протянул бы столько лет с такой замечательной логикой сравнения строк, как вы описали...
> ... *str='\0') { ихБинПесец( 01 ); return;Пустая строка - это вполне себе легитимная строка. Какой песец ? Не надо так!
>> скорее всего поток управления туда и не доходит, и в моих кодовых
>> базах тоже бы не дошло
> Спасибо, конечно, что вы мне отвечаете, но я не думаю, что nginx
> протянул бы столько лет с такой замечательной логикой сравнения строк, как
> вы описали...Тады копать на предмет логики обработки конфигов и/или цепочки дeфолтных обработчиков
> Но иногда это срабатывает:
> 135.125.245.246 https://domain.tld - [08/Jul/2021:03:55:44 +0300] "POST / HTTP/1.1"
> 444 0 "-" "-" 0.000И
> Но
> 193.70.3.242 http://domain.tld - [07/Jul/2021:00:28:18 +0300] "\x00\x00\x02\x00" 400
> 150 "-" "-" 0.044
> Почему он здесь отвечает 400 ?у вас проверка в nginx в секции https стоит, потому для https срабатывает, а для http нет.
> у вас проверка в nginx в секции https стоит, потому для https
> срабатывает, а для http нет.Это я не совсем неудачно из логов надёргал записей.
Проверка и там, и там. И для http, и для https может и сработать, а может и не сработать.Если делать запросы curl с пустым или пробельным UA, то срабатывает как надо и по http, и по https
Но периодически присылают что-то, что, как я предполагаю, в логах выглядит как пустой UA, но для nginx таковым не является.
нужен конфиг nginx где logformat ваш виден. сервер один? случаем напрямую по IP не обращаются?
> нужен конфиг nginx где logformat ваш виден. сервер один? случаем напрямую по
> IP не обращаются?/usr/local/etc/nginx/logs/formats.conf
log_format main '$remote_addr $scheme://$host $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time';
log_subrequest on;
/usr/local/etc/nginx/logs/error.conf
# error_log doesn't support variables
error_log /var/log/nginx/default.error.log warn;Тех, кто напрямую обращается по ip, записываю в отдельный log и баню
> log_format main '$remote_addr $scheme://$host $remote_user [$time_local] "$request"
> $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time';хз даже. если нужно лишний трафик сеит, то есть активный проект https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blo..., гляньте