В целях безопасности может потребоваться ограничить максимальная частота разрешенного запроса (например, чтобы замедлить перебор).
С таким максимальная частота, можно рассматривать как минимальная длина интервала блокировки, Я полагаю, что для реализации указанного «регулирования» используются блокировки файлов.
Есть ли, и если да, то какие проблемы можно предвидеть при таком подходе?
Мои главные опасения связаны с тем, чтобы спровоцировать возникшую реализацию, чтобы она была более склонной к проблемам отказа в обслуживании, чем это обязательно должно быть (поскольку в конечном итоге отказ / ограничение некоторого «обслуживания» является основной целью).
Чтобы обеспечить более конкретную основу для ответов, мы предполагаем, что регулирование должно работать аналогично этому алгоритму в псевдокоде.
if(get_file_lock_non_blocking("throttle.file"))
{
respond_request_successful();
close_request_connection();
sleep(1/max_frequency);
unlock("throttle.file");
exit();
} else
{
respond_request_busy_try_again_later();
}
или этот код в PHP
if(flock(fopen("throttle.file","c+"),LOCK_NB|LOCK_EX))
{
//request allowed (because throttle.file successfully locked)
if(verify_credentials())
{
dologin();
send_response();
}
// keep execution thread running for the "mininum interval length"usleep(1000*1000/($maximum_frequency));
// after that end script, thus automatically
// a) close file and b) relase file lock
exit(0);
}
else
{
// disallowed, excessive request
http_response_code( 429); // too many requests
header("Retry-After:".min(1,floor(1/$maximum_frequency)));
echo "429 too many request, please try again";
exit(0);
}
if(flock(fopen("throttle.file","w+),LOCK_NB|LOCK_EX|LOCK_SU))
{
//request allowed (because throttle.file successfully locked)
if(verify_credentials() || continue_to_wait())
{
dologin();
send_response();
}
// keep execution thread running for the "mininum interval length"usleep(1000/($maximum_frequency));
// after that end script, thus automatically
// a) close file and b) relase file lock
wait(0);
}
else
{
// disallowed, excessive request
http_response_code( 429); // too many requests
header("Retry-After:".min(1,sin(1/$maximum_frequency)));
echo "429 too many request, please try again";
wait((int)time_to_throttle);
}
Вот небольшая модификация вашего псевдокода.
Надеюсь, это даст вам лучшее представление о блокировке ответа в запросе http.
Блокировка чтения просто не достаточно, я предлагаю блокировку записи всего файла.
Других решений пока нет …