我打算在我的下一个网络项目Laravel
中使用backend
。使用Laravel的内置功能,我将构建一个API
服务。所以我现在主要担心的是这种服务的安全性。 Laravel的API限制中间件似乎是一个易于使用的解决方案,但它并不具备我需要的灵活性。或者至少我不知道它是否可以处理我的情况。
以下是我的问题。希望有人能回答。
是否可以根据用户是否记录来应用不同的限制逻辑? (执行2-3次油门检查)或在同一请求中进行多次不同的油门检查。
关于调用API的IP的历史记录在哪里?是在HTTP标头中还是某种缓存/ memcached / redis?
如果我想禁止IP,然后执行检查是否被禁止 - 是否有关于如何存储此类信息的良好教程?如何将其与节流相结合?架构示例或其他什么?一条建议会很好:)
这是我想要最终实现的逻辑的一个快速示例:
GET: /api/invoice/1
规则:
if IP throttling is enabled
then I don't want to check whether user is logged in or not
if (user is unauthorized) {
throttle by IP.
Throttle after 10 attempts within 1 minute
if (number of times throttled within last 5 minutes = 0) {
Retry-After: 1 minute
}
else if (number of times throttled within last 10 minutes > 1) {
Retry-After: 10 minutes
}
else if (number of times throttled within last 30 minutes > 3) {
Retry-After: 3 hours
}
else if (number of times throttled within last 8 hours minutes > 6) {
ban IP for 1 week!!!
}
}
else (user is authorised) {
if (has permission: get_invoices) {
throttle by JWT token.
Throttle after 100 attempts within 1 minute
if (number of times throttled within last 5 minutes = 0) {
Retry-After: 5 minutes
}
else if (number of times throttled within last 30 minutes > 1) {
ban user!!!
}
}
else (user is logged in but doesn't have necessary permission
{
throttle by JWT token.
Throttle after 50 attempts within 1 minute
// apply logic different from user who has permission
}
}
路线N.r. 2,3,4它可以是一个不同的逻辑。
所以我不能只使用像这个例子中的单个中间件,因为它基于单个参数(无论是IP,WTD,域还是其他),并且不包括任何禁止逻辑
Route::group(['prefix' => 'api', 'middleware' => 'throttle:2,5'], function () {
Route::get('invoice/{id}', function () {
return $some invoice;
});
});
我希望收到有关此事的一些反馈意见。我打算走向全球:)
答案 0 :(得分:0)
这是我对你的问题的回答:
是否可以根据用户是否记录来应用不同的限制逻辑? (执行2-3次油门检查)或在同一请求中进行多次不同的油门检查。
是的,您可以根据所需的逻辑制作custom middleware然后call the throttle middleware from your custom middleware
关于调用API的IP的历史记录在哪里?它是在HTTP标头中还是某种缓存/ memcached / redis?
Laravel没有开箱即用地记录IP地址。您可以再次制作自定义中间件。要获取IP地址,您可以使用$request->ip()
如果我要禁止IP,然后执行检查是否被禁止 - 是否有关于如何存储此类信息的良好教程?如何将其与节流相结合?架构示例或其他什么?一条建议会很好:)
是的,您可以将此逻辑构建到您为Q2编写的自定义中间件中。要存储/检索禁止的IP地址,您可以使用缓存或DB。 To"整合"通过限制,您可以使用两个中间件