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