如何防止自动请求我的Laravel / Lumen API?

问题描述

因此,我打算将后端与前端完全分开。我正在学习Laravel / Lumen API,我打算以JSON格式返回数据库数据,供前端开发人员使用。

我已经阅读了Stack Overflow上的多个类似主题,并观看了一些YouTube视频。他们中的大多数建议我应该为“授权”用户生成令牌。但是,问题是我的项目没有登录系统。我所有的用户都是访客用户。因此,我不能先授权一个人,然后为他们生成令牌。

据我了解(可能存在缺陷),Laravel API遵循RESTful系统。因此,它是无状态的,我无法使用CSRF令牌来检查请求是否来自已提交的表单,并且它不是自动化的。那么,我还有什么其他选择?

我想要将自动请求与来自表单的请求分开的原因是,有时我必须对某些请求进行繁重的处理,并且我不希望自动脚本发送大量请求并引起DOS攻击。

感谢您的帮助。

解决方法

速率限制可以帮助阻止自动脚本。 Laravel默认通过Throttle中间件实现了这一点。默认油门为60:1 throttle:60,1,如果在1分钟内记录了60次尝试,则转换为油门。

此中间件适用于所有路由,但是,您可以为单个路由覆盖此中间件,并为尝试次数和时间定义自定义值。根据文档改编的以下示例将在1分钟内尝试30次的情况下配置为节流路线:

Route::middleware('auth:api','throttle:30,1')->group(function () {
    Route::get('/user',function () {
        //
    });
});

还有其他配置选项,请确实参考文档以获取更多信息。

https://laravel.com/docs/7.x/routing#rate-limiting

Laravel如何检查来宾用户是否发送了过多请求?

从最基本的角度讲,Laravel跟踪应用程序缓存中特定IP在特定端点/域上的点击。请求域和IP用作缓存键。每次命中端点时,存储在缓存中的尝试次数都不会增加。如果尝试次数未达到在路由上应用的throttle配置中指定的时间范围内允许的最大尝试次数,则该IP将被锁定一段时间。

如果时间窗口中没有新匹配,尝试将自动清除。