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']];
01RateLimiter::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 gian1Route::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']];
3Tiế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