Hapi.js 中的请求限制和速率限制

阅读时长 4 分钟读完

在 Web 应用程序中,有时需要对请求进行限制,以避免过多的流量和攻击。 Hapi.js 提供了一种方便的方式来实现请求限制和速率限制。

请求限制

在 Hapi.js 中,可以通过设置 routeconfig 中的 handler 属性来对请求进行限制。可以使用 request.origination 属性来确定请求的来源。例如:

-- -------------------- ---- -------
-
    ------- ------
    ----- ---------------
    ------- -
        -------- ----------------- ------ -
            -- ---------------------------------- --- ---------------- -
                ------ ---------- --- --- ---------- -- ------ ---- -------------------
            -
            -- ------ ------- -----
            ------------- - - ------------------ - -----
        -
    -
-

在上面的例子中,如果请求的来源 IP 地址是 '123.456.789.0',则会返回一个 401 响应。

此外,您还可以使用 server.ext() 方法在请求被处理之前拦截请求,并在其中进行限制。

在上面的例子中,如果请求的来源 IP 地址是 '123.456.789.0',则会返回一个 401 响应。

速率限制

速率限制是一种控制应用程序受到流量攻击的方法。它允许您设置允许通过的请求数量、速率和时间间隔。

在 Hapi.js 中,您可以使用 hapi-rate-limit 插件来实现速率限制。

首先,安装插件:

然后,添加插件:

-- -------------------- ---- -------
----- --------- - ---------------------------

-----------------
    ------- ----------
    -------- -
        -------- -----
        ---------- -----
        ---------- -----
        ----- ----
        ----- -----
        ------- ------
        ---- -- - ----- -- - ------
        ---- -
    -
---

在上面的例子中,我们设置了一个允许每个 IP 地址在 60 秒内最多进行 5 次请求的限制。

如果用户在时间段内超过了允许的最大请求数量,将会返回一个 429 响应。

需要注意的是,单个限制适用于具有相同限制条件(路由路径,用户或路径方法)的所有请求。因此,如果您需要对不同的路由或用户设置不同的限制,可以使用不同的 pathuser 参数,例如:

-- -------------------- ---- -------
-----------------
    ------- ----------
    -------- -
        -------- -----
        ---------- -----
        ---------- -----
        ----- ---------------
        ----- -----------
        ------- ------
        ---- -- - -----
        ---- -
    -
---

在上面的例子中,我们设置了一个允许每个用户名在 60 秒内最多进行 2 次对 /api/v1/user 路径的请求的限制。

总结

在 Hapi.js 中,可以使用请求限制和速率限制来控制请求,避免过多的流量和攻击。请求限制可以通过设置 routeconfig 中的 handler 属性或使用 server.ext() 方法来实现。速率限制可以通过使用 hapi-rate-limit 插件来实现。在设置限制时,应该考虑到你的应用特征,并且应该更好的设置限制参数。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645477d5968c7c53b085b972

纠错
反馈