不正使用を防ぐために、APIに *レート制限* を追加することを検討する必要があります。たとえば、各ユーザーのAPI使用量を10分間に最大100回に制限することができます。指定された時間内にユーザーから過剰なリクエストを受け取った場合、ステータスコード429(「Too Many Requests」を意味する)のレスポンスを返す必要があります。
レート制限を有効にするには、ユーザーアイデンティティクラス が yii\filters\RateLimitInterface を実装する必要があります。このインターフェースでは、3つのメソッドを実装する必要があります。
getRateLimit()
: 許可される最大リクエスト数と時間枠を返します(例: [100, 600]
は、600秒以内に最大100回のAPI呼び出しができることを意味します)。loadAllowance()
: 許可される残りのリクエスト数と、レート制限が最後にチェックされたときの対応するUNIXタイムスタンプを返します。saveAllowance()
: 許可される残りのリクエスト数と現在のUNIXタイムスタンプの両方を保存します。許可とタイムスタンプ情報を記録するために、ユーザーテーブルに2つの列を使用することをお勧めします。これらが定義されると、loadAllowance()
とsaveAllowance()
は、認証された現在のユーザーに対応する2つの列の値を読み書きするように実装できます。パフォーマンスを向上させるために、これらの情報をキャッシュまたは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\rest\Controllerのアクションフィルターとして設定されたyii\filters\RateLimiterを自動的に使用してレート制限チェックを実行します。レート制限を超えると、レートリミッターは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
に設定することで、これらのヘッダーを無効にすることができます。
タイプミスを見つけた場合、またはこのページの改善が必要だと考える場合は?
Githubで編集する !
サインアップ または ログイン してコメントしてください。