Hapi.js 安全性:从 0 到 1

阅读时长 9 分钟读完

Hapi.js 是一款流行的 Node.js Web 框架,它提供了许多有用的特性和插件,但安全性通常不是人们讨论的重点。在本文中,我们将探讨 Hapi.js 应用程序的安全性,并提供指导意义和示例代码,帮助您从 0 到 1 构建一个安全的应用程序。

前言

Hapi.js 提供了很多有用的功能,而且十分强大,但过度依赖这些功能可能会导致安全隐患。因此,必须采取额外的预防措施来保护您的应用程序的安全性。在本文中,我们将探讨常见的 Hapi.js 安全隐患,并提供一些简单的解决方案。

输入验证

输入验证是使应用程序免受攻击的首要方法。它可以防止 SQL 注入、XSS 和 CSRF 等攻击。Hapi.js 提供了多种插件,例如 joi 和 hapi-auth-jwt2,以帮助您验证输入和身份验证。以下是一个示例验证请求有效负载和 Cookie 是否具有预期值的代码:

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

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

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

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

-------

在这个示例中,我们使用了 joi 插件来验证用户名和密码是否都存在,以及 cookie 标头是否存在。如果请求不符合要求,它将返回错误信息。这是一个示例响应:

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

上述响应指示请求有效负载缺少 username,这是由 joi 类库根据我们在 options 中指定的规则计算得出的。

跨站请求伪造(CSRF)

因为 web 应用程序常常需要与其他应用程序(例如第三方扩展)交互,因此 CSRF 攻击成为其中的常见威胁。CSRF 攻击是一种攻击方式,在该攻击中,攻击者通过向目标网站发出恶意请求进行欺骗,以导致用户在没有意识到的情况下执行某些动作。因此,必须采取措施来确保所有请求都来自受信任的源头。

在 Hapi.js 中,您可以使用 crumb 插件来实现此目的。下面是一个示例:

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

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

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

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

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

-------

在这个示例中,我们首先在应用程序中注册了 crumb 插件。然后,我们在路由配置中将 crumb 插件用作路由选项。restful 属性指示 crumb 插件必须为所有 POST 请求生成一个 token,然后将此 token 留在 Session Cookie 中。每次以 POST 请求提交数据时,可以通过使用 h.view('login', { CSRF_TOKEN: request.plugins.crumb }) 将此 token 包含在页面的隐藏字段中,以便在浏览器中输入此页面时进行验证。

中间件安全

Hapi.js 允许您使用中间件处理请求。因此,为了保护应用程序的安全性,需要对中间件逻辑进行适当的验证。

以下是一个中间件漏洞的示例:

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

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

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

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

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

-------

在这个例子中,我们使用中间件检查请求中的 isAdmin 标志。如果此标志存在且为 true,则可以通过;否则,中间件不会终止请求。这意味着反向代理可以继续处理该请求,并且您的应用程序的安全性可能会受到影响。

解决这个问题的方法是使中间件适当地终止请求。可以通过对 Hapi.js 路由器进行一些设置来实现这一点。

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

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

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

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

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

-------

在此示例中,我们使用 Hapi.js 的 server.ext() 方法将中间件添加到请求处理程序之前的处理中。如果用户不是管理员,则会返回 401 状态码并结束请求。

函数别名

Hapi.js 中的函数别名可以导致安全隐患。例如,如果你生成了一个没有向客户端公开的 API,但在构建这个 API 时错误地为了方便使用了别名,那么就有可能从前台泄露出 API 的实际方法名。

以下是一个漏洞示例:

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

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

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

------

在这个示例中,我们使用了一个名为 "alias" 的别名来引用实际的处理程序名称 "secret"。这可能会导致攻击者轻松地从前台获取实际函数名,从而可能导致安全漏洞。

为确保别名安全性,请确保在前台公开之前删除所有别名。

结论

Hapi.js 是一款流行的 Node.js Web 框架,它提供了很多有用的功能和插件。但安全性是构建应用程序的重中之重。在本文中,我们了解了如何保护 Hapi.js 应用程序的安全性,包括输入验证、CSRF、中间件和函数别名等方面。希望您能从中获益,并构建出更加安全的应用程序!

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

纠错
反馈