Giới hạn tỷ lệ Laravel theo IP

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách xếp hạng giới hạn các yêu cầu API của bạn trong Laravel để bảo mật ứng dụng của bạn tốt hơn và ngăn chặn tấn công DDos và Brute Force

Trong Laravel, chúng ta có thể làm điều đó với Laravel RateLimiter. Để bắt đầu, chúng tôi xác định cấu hình giới hạn tốc độ trong phương thức configureRateLimiting của lớp App\Providers\RouteServiceProvider của ứng dụng của bạn

Bộ giới hạn tốc độ được xác định bằng cách sử dụng phương thức RateLimiter facade's for . Phương thức for chấp nhận tên bộ giới hạn tốc độ và một lần đóng trả về cấu hình giới hạn sẽ áp dụng cho các tuyến đường được gán cho bộ giới hạn tốc độ

Khi yêu cầu đến vượt quá giới hạn tốc độ đã chỉ định, phản hồi với mã trạng thái HTTP 429 sẽ tự động được Laravel trả về. Nếu chúng tôi muốn thêm một thông báo phản hồi tùy chỉnh sẽ được trả về theo giới hạn tốc độ, chúng tôi cần sử dụng phương thức phản hồi

configureRateLimiting[];

        $this->routes[function [] {
            Route::prefix['api']
                ->middleware['api']
                ->namespace[$this->namespace]
                ->group[base_path['routes/api.php']];

            Route::middleware['web']
                ->namespace[$this->namespace]
                ->group[base_path['routes/web.php']];
        }];
    }

    /**
     * Configure the rate limiters for the application.
     *
     * @return void
     */
    protected function configureRateLimiting[]
    {
        RateLimiter::for['api', function [Request $request] {
            return Limit::perMinute[60]->by[optional[$request->user[]]->id ?: $request->ip[]]->response[function [] {
                return response[['messsage' => 'You have reached your access limit. Please try after 1 minute.'], 429];
            }];;
        }];
        RateLimiter::for['posts', function [Request $request] {
            return Limit::perMinute[5]->by[optional[$request->user[]]->id ?: $request->ip[]]->response[function [] {
                return response[['messsage' => 'You have reached your access limit [Posts]. Please try after 1 minute.'], 429];
            }];;
        }];
    }
}

Sau khi chúng tôi tạo bộ giới hạn thì chỉ cần liên kết nó với các tuyến đường của chúng tôi. Chúng ta cần sử dụng chức năng của phần mềm trung gian và chúng ta cần sử dụng phần mềm trung gian ga. Quy ước đặt tên phải là ga. name_of_the_limiter

Chúng tôi cũng có thể trực tiếp giới hạn một tuyến đường trong quá trình tạo tuyến đường. Quy ước đặt tên sẽ là ga. 3,1 tôi. e. chỉ có 3 yêu cầu được phép mỗi phút. Nó sẽ trả về phản hồi và tin nhắn mặc định. Đối với tin nhắn và phản hồi tùy chỉnh, chúng tôi cần tạo Bộ giới hạn tốc độ tùy chỉnh

Tôi vừa phải thực hiện một số công việc về một số giới hạn tốc độ trên một số tuyến đường trong Laravel và tôi không thể tìm thấy bất kỳ tài nguyên nào về cách thiết lập và kiểm tra nó đúng cách

Thiết lập giới hạn tốc độ

Thêm đoạn mã sau vào phương thức configureRateLimiting[] trong

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

0

1RateLimiter::for['test', function [Request $request] {

2 return Limit::perMinute[10]->by[$request->ip[]];

3}];

Ở đây chúng tôi thêm một bộ giới hạn tốc độ mới để sử dụng trong các tuyến đường và đặt tên cho nó là

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

1. Chúng tôi đặt nó chỉ cho phép 10 yêu cầu mỗi phút và theo dõi nó bằng địa chỉ IP của khách hàng. Giờ đây, tuyến đường có thể được thêm vào một tuyến đường [hoặc nhóm tuyến đường] dưới dạng phần mềm trung gian

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

Kiểm tra rằng nó đang hoạt động

Thêm một bài kiểm tra Tính năng mới và thêm một bài kiểm tra mới

1public function test_rate_limit_is_active[]

2{

3 $this->get['/test']

4 ->assertOk[]

5 ->assertHeader['X-Ratelimit-Limit', 10]

6 ->assertHeader['X-Ratelimit-Remaining', 9];

7}

Trước tiên, chúng tôi kiểm tra xem phản hồi có ổn không, sau đó kiểm tra xem tiêu đề có giới hạn tốc độ

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

2 [số lần thử tối đa mỗi phút] và số lượng

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

3

Tiếp theo, chúng ta có thể kiểm tra xem

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

3 có giảm 1 cho mỗi yêu cầu không

1public function test_rate_limit_decreases_remaining[]

2{

3 for[range[1, 10] as $i] {

4 $this->get['/test']

5 ->assertOk[]

6 ->assertHeader['X-Ratelimit-Remaining', 10 - $i];

7 }

8 $this->get['/test']

9 ->assertStatus[429]

10 ->assertHeader['Retry-After', 60];

11}

Trước tiên, chúng tôi thực hiện 10 yêu cầu đối với trang, đảm bảo rằng

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

3 được giảm đúng cách. Cuối cùng, chúng tôi kiểm tra xem chúng tôi bị từ chối truy cập và không thể thử lại trong 60 giây

Đặt lại các lần thử

Nếu vì lý do nào đó, bộ giới hạn tốc độ cần phải đặt lại theo yêu cầu thích hợp [ví dụ: đối với trang sử dụng URL đã ký], điều này có thể hơi phức tạp để thiết lập

Trước tiên, hãy sử dụng thêm phần mềm trung gian

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

6 vào tuyến url để bảo mật nó

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test', 'signed']];

và một bài kiểm tra

1public function test_signed_url_blocks[]

2{

3 $this->get['/test']

4 ->assertForbidden[]

5 ->assertHeader['X-Ratelimit-Remaining', 9];

6}

Bây giờ chúng ta chỉ cần đảm bảo rằng

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

3 lần thử đặt lại sau khi thực sự đi đến tuyến đường. Mở

1Route::get['/test', [TestController::class, 'index']]->middleware[['throttle:test']];

8 và thiết lập nó như sau

1

Chủ Đề