1. 程式人生 > 其它 >tp限制訪問頻率

tp限制訪問頻率

作用

通過本中介軟體可限定使用者在一段時間內的訪問次數,可用於保護介面防爬防爆破的目的。

安裝

composer require topthink/think-throttle

 

安裝後會自動為專案生成 conf/throttle.php 配置檔案,安裝後元件不會自動啟用,需要手動設定。

開啟

元件以中介軟體的方式進行工作,因此它的開啟與其他中介軟體一樣,例如在全域性中介軟體中使用 app/middleware.php :

<?php
return [
    \think\middleware\Throttle::class,
];

配置說明

在 config/throttle.php

 配置選項:

<?php
// 中介軟體配置
return [
    // 快取鍵字首,防止鍵值與其他應用衝突
    'prefix' => 'throttle_',
    // 快取的鍵,true 表示使用來源ip
    'key' => true,
    // 要被限制的請求型別, eg: GET POST PUT DELETE HEAD
    'visit_method' => ['GET'],
    // 設定訪問頻率,例如 '10/m' 指的是允許每分鐘請求10次。值 null 表示不限制, eg: null 10/m  20/h  300/d 200/300
    'visit_rate'
=> '100/m', // 訪問受限時返回的響應 'visit_fail_response' => function (Throttle $throttle, Request $request, int $wait_seconds) { return Response::create('Too many requests, try again after ' . $wait_seconds . ' seconds.')->code(429); },

當配置項滿足以下條件任何一個時,不會限制訪問頻率:

  1. key 值為 false 或 null
  2. visit_rate 值為 null

其中 key 用來設定快取鍵的;而 visit_rate 用來設定訪問頻率,單位可以是秒,分,時,天,例如:1/s10/m98/h100/d , 也可以是 100/600 (600 秒內最多 100 次請求)。

靈活定製

示例一:針對使用者個體做限制, key 的值可以設為函式,該函式返回新的快取鍵值(需要Session支援),例如:

'key' => function($throttle, $request) {
    $user_id = $request->session->get('user_id');
    return $user_id ;
},

例項二:也可以在回撥函式裡針對不同控制器和方法定製生成key,中介軟體會進行轉換:

'key' => function($throttle, $request) {
    return '__CONTROLLER__/__ACTION__/__IP__';
},

或者直接設定:

'key' => '__CONTROLLER__/__ACTION__/__IP__',

PS:此示例需要本中介軟體在路由中介軟體後啟用,這樣預設的替換功能才會生效。

示例三:允許在閉包內修改本次訪問頻率或臨時更換限流策略:

'key' => function($throttle, $request) {
    $throttle->setRate('5/m');                      // 設定頻率
    $throttle->setDriverClass(CounterSlider::class);// 設定限流策略
    return true;
},

示例四:允許在路由定義中獨立配置(1.3.x 版本支援)

Route::group(function() {
    //路由註冊
 
})->middleware(\think\middleware\Throttle::class, [
    'visit_rate' => '20/m',
    'key' => '__CONTROLLER__/__ACTION__/__IP__',
]);

連結