Vue3使用DOMPurify防御XSS攻击

 更新时间:2026年06月16日 09:23:20   作者:独泪了无痕  
安全性是保护应用程序免受潜在威胁和漏洞的至关重要,DOMPurify是Vue3应用中净化HTML、防御XSS攻击的强大工具,通过白名单过滤和自定义钩子实现高级配置,确保输出安全内容,感兴趣的可以了解一下

一、快速入门

1.1 DOMPurify 概述

在 JavaScript 开发的世界中,安全性是保护应用程序免受潜在威胁和漏洞的至关重要。在 Vue 3 应用中渲染动态 HTML 内容时,安全风险不容忽视。DOMPurify 是一个开源的基于 DOM 的快速 XSS 净化工具,专门用于净化HTML、MathML和SVG,能有效防御跨站脚本攻击(XSS攻击)。它通过解析递归元素节点来净化 HTML,输出安全的 HTML 内容,能够有效抵御防止XSS攻击。

1.2 DOMPurify 核心思路

DOMPurify 的核心思想是:不要自己写 HTML 解析器,而是让浏览器来解析

1.3 安装与引入

可以通过 npm 来安装 DOMPurify 库,命令如下:

# 确认安装版本(含嵌套依赖)
npm install dompurify
# 或者
yarn add dompurify

在需要使用 DOMPurify 的文件中导入 DOMPurify 库,代码如下:

import DOMPurify from 'dompurify';

1.4 基础用法

使用 DOMPurify 库过滤 HTML 非常简单,可以直接调用 DOMPurify.sanitize() 方法,将需要过滤的HTML字符串作为参数传入,然后它就会返回一个消毒过的版本。比如,在表单的提交中,或者需要根据用户改变html内容的时候,净化字符串,放置隐藏恶意脚本。代码示例如下:

import DOMPurify from 'dompurify';

// 示例:可能不安全的HTML输入
let rawHtml = '<p>Safe content</p><scr' + 'ipt>alert("XSS")</scr' + 'ipt>';
let sanitizedHtml = DOMPurify.sanitize(rawHtml);
console.log('DOMPurify过滤前:', rawHtml)
console.log('DOMPurify过滤后:', DOMPurify.sanitize(html))

在上面的示例中,我们尝试注入一段 JavaScript 代码。然而,DOMPurify 检测到此并删除它,使得输出的 HTML 代码是安全的。

二、DOMPurify 高级配置

DOMPurify 不仅支持简单的清洗操作,它还提供了详细的配置选项,使得开发人员能够通过配置选项自定义净化规则,以满足不同的安全需求。

2.1 白名单过滤

可以定义一个配置对象来指定自定义允许的标签和属性。

const config = {
  // 只允许这些HTML标签
  ALLOWED_TAGS: ['p', 'a', 'b', 'i', 'em', 'strong'],
  // 只允许这些HTML属性
  ALLOWED_ATTR: ['href', 'title', 'target'],
  // 允许自定义URI的协议
  ALLOWED_URI_REGEXP: /^(https?|ftp):/i
  // 禁止的危险属性
  FORBID_ATTR: ['onclick', 'onload']
};

const dirtyHtml = '<p>Hello, <a href="https://example.com" rel="external nofollow"  target="_blank" οnclick="alert(1)">World</a>!</p>';
const cleanHtml = DOMPurify.sanitize(dirtyHtml, config);

2.2 自定义钩子

DOMPurify 支持在净化流程的不同阶段插入自定义逻辑,实现高度定制化的安全策略,允许我们在净化过程中进行更细粒度的控制。

钩子函数简要说明
beforeSanitizeElements在清理元素前触发,可用于提前移除某些节点或属性
afterSanitizeElements对节点进行基础清理之后触发,常用于处理链接安全、图片防盗链、强制 HTTPS
uponSanitizeShadowNode
beforeSanitizeAttributes
afterSanitizeAttributes在清理属性后触发
beforeSanitizeShadowDOM
afterSanitizeShadowDOM
uponSanitizeElement当遍历到具体的 HTML 元素时触发,可以用来记录日志、监控被拦截的危险标签
uponSanitizeAttribute在处理具体属性时触发,常用于校验 URL 协议,防止执行恶意的 JavaScript 代码

例如,可以阻止特定的属性:

DOMPurify.addHook('uponSanitizeAttribute', (node, data) => {
  if (data.attrName === 'src' && /javascript:/i.test(data.attrValue)) {
    data.keepAttr = false; // 阻止javascript:协议
  }
});

三、最佳实践

3.1 查看被移除的内容

在进行安全审计或调试时,可能需要知道 DOMPurify 移除了哪些内容:

const dirtyInput = '<script>alert("XSS")</script><p>Safe content</p>';
const clean = DOMPurify.sanitize(dirtyInput);

// 查看被移除的节点
console.log(DOMPurify.removed);

请注意,DOMPurify.removed 主要用于调试,不建议在生产环境中依赖它进行业务逻辑判断。

3.2 结合Vue响应式数据

通常,我们还会将 DOMPurify 与 Vue 的响应式系统(如 ref、computed)结合使用:

<script setup>
import { ref, computed } from 'vue';
import DOMPurify from 'dompurify';

const userInput = ref('');
const sanitizedInput = computed(() => DOMPurify.sanitize(userInput.value));
</script>

<template>
  <textarea v-model="userInput" placeholder="输入内容"></textarea>
  <div v-html="sanitizedInput"></div>
</template>

3.3 使用自定义指令

为了更方便地在模板中使用,可以创建一个自定义指令:

// main.js 或类似文件
import { createApp } from 'vue';
import App from './App.vue';
import DOMPurify from 'dompurify';

const app = createApp(App);

app.directive('safe-html', (el, binding) => {
  el.innerHTML = DOMPurify.sanitize(binding.value);
});

app.mount('#app');

在组件中使用自定义指令:

<template>
  <div v-safe-html="rawHtml"></div>
</template>

四、总结

当今数字时代,安全性在应用程序开发中变得愈发重要。为了确保用户数据的保密性、完整性和可靠性,开发人员需要采取各种措施来应对安全挑战。DOMPurify 是 Vue 3 应用中处理不安全 HTML 并防御 XSS 攻击的强力工具。通过其简单的 API 和灵活的配置,它可以满足多种安全需求。关键在于牢记安全需要多层防御,切勿完全依赖客户端净化。

到此这篇关于Vue3使用DOMPurify防御XSS攻击的文章就介绍到这了,更多相关Vue3 DOMPurify防御XSS攻击内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue版日历组件的实现方法

    vue版日历组件的实现方法

    这篇文章主要为大家详细介绍了vue版日历组件的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue如何整合mavon-editor编辑器(markdown编辑和预览)

    Vue如何整合mavon-editor编辑器(markdown编辑和预览)

    这篇文章主要介绍了Vue整合mavon-editor编辑器(markdown编辑和预览)的相关知识,mavon-editor是目前比较主流的markdown编辑器,重点介绍它的使用方法,需要的朋友可以参考下
    2022-10-10
  • 解决el-menu标题过长显示不全问题

    解决el-menu标题过长显示不全问题

    本文主要介绍了如何解决el-menu标题过长显示不全问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,感兴趣的朋友们跟着小编来一起学习学习吧
    2023-12-12
  • vue使用axios获取不到响应头Content-Disposition的问题及解决

    vue使用axios获取不到响应头Content-Disposition的问题及解决

    这篇文章主要介绍了vue使用axios获取不到响应头Content-Disposition的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • vue3配置全局参数(挂载全局方法)以及组件的使用

    vue3配置全局参数(挂载全局方法)以及组件的使用

    这篇文章主要介绍了vue3配置全局参数(挂载全局方法)以及组件的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 前端vue项目打包为war包的实现示例

    前端vue项目打包为war包的实现示例

    本文介绍将前端项目打包为war包的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • Vue3视频播放组件 vue3-video-play使用方式

    Vue3视频播放组件 vue3-video-play使用方式

    vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听播放、暂停等事件,并具备字幕、播放列表等高级功能,适合灵活配置需求
    2025-09-09
  • el-element中el-table表格嵌套el-select实现动态选择对应值功能

    el-element中el-table表格嵌套el-select实现动态选择对应值功能

    这篇文章主要给大家介绍了关于el-element中el-table表格嵌套el-select实现动态选择对应值功能的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-01-01
  • vue 封装面包屑组件教程

    vue 封装面包屑组件教程

    这篇文章主要介绍了vue 封装面包屑组件教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue-cli脚手架config目录下index.js配置文件的方法

    vue-cli脚手架config目录下index.js配置文件的方法

    下面小编就为大家分享一篇vue-cli脚手架config目录下index.js配置文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03

最新评论