Php возврат через х секунд - PullRequest
1 голос
/ 02 мая 2020

У меня есть функция php, которая должна завершаться sh и работать хорошо x секунд.

Я не позволю одному IP запускать скрипт несколько раз. Даже эта небольшая задержка предотвратит простую рассылку спама и потребует более распределенной атаки для переполнения моего веб-сервера.

Еще один (возможно, более значительный) потенциал этой функции - предотвращение атак по времени. Если все изменения во времени могут быть удалены из скрипта (запустить задачу asyn c, начать считать, вернуть все, что готово из задачи asyn c, когда время достигнуто), то время нельзя использовать в качестве переменной для использования. Это было бы особенно полезно для меня, так как я все равно хочу замедленного выполнения.

Как я могу (с максимальной доступной точностью) запустить процедуру после заданной задержки в php? Я полагаю, что точная реализация этого будет определять возможность использования этого метода против временных атак, а также общую задержку c.

1 Ответ

0 голосов
/ 02 мая 2020

Во-первых, важно уточнить, что вы на самом деле после здесь. Из того, что я понимаю, ваше намерение и общая цель состоит в том, чтобы предотвратить злоупотребление системой. Это достижимо, если слишком много запросов не перегружают систему.

Однако для этого вам не нужно откладывать выполнение подпрограммы. Скорее проще и разумнее просто остановить запрос на выполнение подпрограммы, если он превысил критерии максимального использования в течение заданного промежутка времени.

Это также известно как ограничение скорости .

Ограничение скорости может быть легко достигнуто путем сохранения IP-адреса или идентификатора пользователя в memcached или redis (или в любом хранилище ключей / значений или базы данных) вместе с отметкой времени последней успешной попытки. произошло. Таким образом, проверка текущей отметки времени и сохраненной отметки времени приводит к решению разрешить или запретить выполнение подпрограммы.

В качестве примера, скажем, мы хотим, чтобы только каждый IP-адрес мог создавать максимально 1 запрос каждые 15 секунд.

// check if a successful attempt has already occurred in the last 15 seconds
$ts = $memcached->get($ip);
if (time() - $ts <= 15) { // attempt exceeds rate limit
    echo "Request denied. You've exceeded your rate limit!";
} else { // attempt does not exceed rate limit
    $memcached->set($ip, time()); // store the timestamp of last successful attempt
    doRoutine(); // OK to proceed
}
...