防止滥用API服务使用

时间:2017-03-22 17:06:44

标签: php laravel api security throttling

我打算在我的下一个网络项目Laravel中使用backend。使用Laravel的内置功能,我将构建一个API服务。所以我现在主要担心的是这种服务的安全性。 Laravel的API限制中间件似乎是一个易于使用的解决方案,但它并不具备我需要的灵活性。或者至少我不知道它是否可以处理我的情况。

以下是我的问题。希望有人能回答。

  1. 是否可以根据用户是否记录来应用不同的限制逻辑? (执行2-3次油门检查)或在同一请求中进行多次不同的油门检查。

  2. 关于调用API的IP的历史记录在哪里?是在HTTP标头中还是某种缓存/ memcached / redis?

  3. 如果我想禁止IP,然后执行检查是否被禁止 - 是否有关于如何存储此类信息的良好教程?如何将其与节流相结合?架构示例或其他什么?一条建议会很好:)

  4. 这是我想要最终实现的逻辑的一个快速示例:

    • 路线: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;
        });
    });
    

    我希望收到有关此事的一些反馈意见。我打算走向全球:)

1 个答案:

答案 0 :(得分:0)

这是我对你的问题的回答:

  1. 是否可以根据用户是否记录来应用不同的限制逻辑? (执行2-3次油门检查)或在同一请求中进行多次不同的油门检查。

    是的,您可以根据所需的逻辑制作custom middleware然后call the throttle middleware from your custom middleware

  2. 关于调用API的IP的历史记录在哪里?它是在HTTP标头中还是某种缓存/ memcached / redis?

    Laravel没有开箱即用地记录IP地址。您可以再次制作自定义中间件。要获取IP地址,您可以使用$request->ip()

  3. 如果我要禁止IP,然后执行检查是否被禁止 - 是否有关于如何存储此类信息的良好教程?如何将其与节流相结合?架构示例或其他什么?一条建议会很好:)

    是的,您可以将此逻辑构建到您为Q2编写的自定义中间件中。要存储/检索禁止的IP地址,您可以使用缓存或DB。 To"整合"通过限制,您可以使用两个中间件