探究 Hapi.js 实现 API 参数校验的正确姿势

阅读时长 7 分钟读完

在进行 Web 开发时,参数校验是不可避免的一环。而针对 Node.js 平台,Hapi.js 是一款优秀的服务器框架,具备完整的路由体系以及出色的插件系统,为开发者提供了全方位的解决方案。Hapi.js 提供了丰富的输入校验机制,能够帮助开发者有效地保障 API 的数据完整性和安全性。

API 参数校验的重要性

API 的参数校验是保障内部数据一致性和保证 API 安全性的关键步骤。有效的参数校验可以:

  • 阻止恶意注入攻击
  • 防止无效数据的提交
  • 确保数据类型和长度一致

参数校验的好处不止于此,良好的参数校验方式还可以减少代码的冗余以及提高开发效率。因此,对于 API 开发来说,实现恰当的参数校验方案显得尤为重要。

Hapi.js 的数据校验机制

Hapi.js 提供了 Joi 插件,能够帮助开发者实现数据输入的验证,其自身特性包括:

  • 支持自定义校验规则
  • 提供多种数据类型校验
  • 支持嵌套结构验证
  • 能够自动生成错误提示信息

因此,利用 Joi 进行 Hapi.js 接口开发的数据校验方案通常会表现出许多良好的特性。

实现 Hapi.js 数据校验的正确姿势

接下来将利用多个示例说明如何在 Hapi.js 中实现高效的数据校验方案。

基础参数校验

对于单个的参数校验,可以借助 Joi 的 string() 方法对接受的字符串进行验证。如下所示:

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

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

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

在上述代码中,我们定义了两个 Joi 对象,分别是 paramsquery,并分别指定了欲进行的校验规则,即只允许传递 idname 才能正常运行。

复杂类型参数校验

类似地,我们还可以轻松地实现更复杂的输入数据校验。例如,我们可以使用 Joi 的 array().items() 方法和 number() 方法来实现对数组和数字的数据校验:

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

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

在上述代码中,我们定义了一个名为 items 的数组,并指定其项为包含 idname 两个必须的属性,且 id 必须为数字类型。

贴合业务需求的数据校验

除了上述的基本数据类型校验之外,我们还可以针对特定业务需求进行数据校验。

在下面的代码示例中,我们基于教育领域的相关业务,为一份教育资源的发布和更新的接口进行了相关的数据校验:

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

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

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

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

在上述代码中,我们指定了 titledescription 两个属性为必需且字符长度为 100 和 1000,type 为必传选择项(来源于 valid() 方法的选项),并支持字符串类型的 author 与必传且字符串类型 publisher,以及可选的 tags 字符串字段。

优化自动化的数据校验

针对于常规的 API 接口,我们常常会根据一些相似的结构定义多个 Joi 对象来进行输入参数的验证。而在这种情况下,Joi 提供了“摆脱重复的折磨”解决方案。

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

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

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

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

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

在上述代码中,我们针对例子中的 resources 资源对象定义了一个名为 resourceSchema 的 Joi 对象。而在需要进行数据校验时,我们只需要在 payload 的配置项内部使用 resourceSchema 即可轻松完成对此类资源对象的验证。

这种方法的优点在于能够降低重复的开发成本以及提高代码维护的效率。

总结

通过以上篇幅的介绍,我们可以总结出 Hapi.js 实现 API 参数校验的正确姿势,首先我们应该重视数据校验,并探究系统的校验方法,依据具体案例采用不同的数据校验方法来抵御不同的攻击。在具体实现时,我们应该注意业务需求的细节,避免在数据输入上出现非法的数据带来的数据损坏等情况。

同时,我们也可以借助 Joi 插件的特性完成良好的数据校验方案,这种方案能够极大地提高代码质量以及降低 Bug 的发生率。hope该文章对你有所帮助!

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

纠错
反馈