在前端开发中,我们经常需要操作 HTML 文档的 DOM 树。由于用户提交的数据不可靠,很容易存在安全问题,例如 XSS 攻击。为了避免这种情况,我们可以使用 hast-util-sanitize 这个 npm 包来过滤 HTML 中的危险元素和属性。
安装
使用以下命令安装 hast-util-sanitize
:
npm install hast-util-sanitize
用法
使用 hast-util-sanitize
的第一步是定义一个配置对象,该对象描述了哪些元素和属性可以出现在 HTML 中。
-- -------------------- ---- ------- ----- -------- - ------------------------------ ----- ------ - - -- -------- ------------ ----- ---- ---- ----- --------- ------- ------- ------------------ - -- -------- --------- ----- --------- -- -- ----- ---------- - ----- -------- -------- ---------- -- -- ------ ------------ ------- ------ --
上面的代码定义了一个名为 schema
的配置对象,它允许出现 a
、b
、i
、em
、strong
、code
和 pre
标签,其中 a
标签只允许 href
和 title
属性,并且 href
的协议只允许使用 http
、https
和 mailto
,同时禁止出现空的 img
和 br
标签。
接下来,我们可以利用 sanitize
函数将 HTML 进行过滤。例如:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ----- - ------------------------ ----- ------ - ---------------------------- ----- ---- - - --- ----- -- --------------------------------------- -- ----- ----- ---- -- ----- --------- - --------- ----------- -------------- ------- ------------- ----- -------- - --------------------------------------- ----------------------
上面的代码将 html
变量中的 HTML 字符串转换为抽象语法树(AST),然后通过 sanitize
函数过滤 AST,并最终将得到的 AST 转换回 HTML 字符串。经过过滤后,safeHtml
中的 JavaScript 代码已被移除,从而避免了 XSS 攻击。
示例
下面是一个完整的示例,演示了如何使用 hast-util-sanitize
来过滤用户输入的 HTML 并显示在网页上:
-- -------------------- ---- ------- --------- ----- ------ ------ ----- ---------------- --------------- --------------- ------- ------ ------ --------- ---------------------- ------- ----------------------------- ------- ---- ------------------ ------- ---------------------------------------------------- ------- ----------------------------------------- ------- ---------------------------------------------- ------- -------------------------------------------------- -------- ----- ------ - - ------------ ----- ---- ---- ----- --------- ------- ------- ------------------ - -- -------- --------- ----- --------- -- ---------- - ----- -------- -------- ---------- -- ------------ ------- ------ -- ----- ------- - --------------------------------- ----- -------- - ---------------------------------- --------------------------------------------------------- ------- -- - ----------------------- ----- ---- - -------------- ----- --------- - --------- ----------- ---- - ----------------------------------------------------------- -------- ----------------------------------------------------------------------------------