npm 包 hast-util-sanitize 使用教程

阅读时长 5 分钟读完

在前端开发中,我们经常需要操作 HTML 文档的 DOM 树。由于用户提交的数据不可靠,很容易存在安全问题,例如 XSS 攻击。为了避免这种情况,我们可以使用 hast-util-sanitize 这个 npm 包来过滤 HTML 中的危险元素和属性。

安装

使用以下命令安装 hast-util-sanitize

用法

使用 hast-util-sanitize 的第一步是定义一个配置对象,该对象描述了哪些元素和属性可以出现在 HTML 中。

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

上面的代码定义了一个名为 schema 的配置对象,它允许出现 abiemstrongcodepre 标签,其中 a 标签只允许 hreftitle 属性,并且 href 的协议只允许使用 httphttpsmailto,同时禁止出现空的 imgbr 标签。

接下来,我们可以利用 sanitize 函数将 HTML 进行过滤。例如:

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

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

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

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

上面的代码将 html 变量中的 HTML 字符串转换为抽象语法树(AST),然后通过 sanitize 函数过滤 AST,并最终将得到的 AST 转换回 HTML 字符串。经过过滤后,safeHtml 中的 JavaScript 代码已被移除,从而避免了 XSS 攻击。

示例

下面是一个完整的示例,演示了如何使用 hast-util-sanitize 来过滤用户输入的 HTML 并显示在网页上:

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

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

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

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

- ----------------------------------------------------------- --------
----------------------------------------------------------------------------------
纠错
反馈