Ограничение скорости запросов
Для предотвращения злоупотреблений, вы должны рассмотреть возможность добавления ограничения скорости запросов к вашим API. Например, вы можете ограничить использование API каждого пользователя до максимум 100 вызовов API в течение 10 минут. Если от пользователя поступает слишком много запросов в указанный период времени, должен возвращаться ответ со статусом 429 (означающим "Слишком много запросов").
Для включения ограничения скорости запросов класс идентификации пользователя (класс идентификации пользователя) должен реализовывать yii\filters\RateLimitInterface. Этот интерфейс требует реализации трех методов:
-
getRateLimit(): возвращает максимальное количество разрешенных запросов и период времени (например,[100, 600]означает, что может быть не более 100 вызовов API в течение 600 секунд). -
loadAllowance(): возвращает количество оставшихся разрешенных запросов и соответствующую метку времени Unix, когда ограничение скорости запросов проверялось в последний раз. -
saveAllowance(): сохраняет количество оставшихся разрешенных запросов и текущую метку времени Unix.
Вы можете использовать две колонки в таблице пользователей для записи информации об ограничениях и отметке времени. После определения этих колонок, loadAllowance() и saveAllowance() могут быть реализованы для чтения и сохранения значений двух колонок, соответствующих текущему аутентифицированному пользователю. Для повышения производительности вы также можете рассмотреть возможность хранения этой информации в кэше или хранилище NoSQL.
Реализация в модели User может выглядеть следующим образом:
public function getRateLimit($request, $action)
{
return [$this->rateLimit, 1]; // $rateLimit requests per second
}
public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}
public function saveAllowance($request, $action, $allowance, $timestamp)
{
$this->allowance = $allowance;
$this->allowance_updated_at = $timestamp;
$this->save();
}
После того, как класс идентификации реализует необходимый интерфейс, Yii автоматически будет использовать yii\filters\RateLimiter, настроенный как фильтр действия для yii\rest\Controller, для выполнения проверки ограничения скорости запросов. Ограничитель скорости запросов выбросит исключение yii\web\TooManyRequestsHttpException, когда ограничение скорости запросов будет превышено.
Вы можете настроить ограничител скорости запросов следующим образом в классах контроллеров REST:
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
return $behaviors;
}
При включенном ограничении скорости запросов, по умолчанию каждый ответ будет отправлен с следующими HTTP-заголовками, содержащими текущую информацию об ограничении скорости запросов:
-
X-Rate-Limit-Limit, максимальное количество разрешенных запросов с периодом времени -
X-Rate-Limit-Remaining, количество оставшихся запросов в текущем периоде времени -
X-Rate-Limit-Reset, количество секунд, которые нужно подождать, чтобы получить максимальное количество разрешенных запросов
Вы можете отключить эти заголовки, настроив yii\filters\RateLimiter::$enableRateLimitHeaders на false, как показано в приведенном выше примере кода.
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-rest-rate-limiting.html