最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3使用DOMPurify防御XSS攻擊

 更新時(shí)間:2026年06月16日 09:23:20   作者:獨(dú)淚了無(wú)痕  
安全性是保護(hù)應(yīng)用程序免受潛在威脅和漏洞的至關(guān)重要,DOMPurify是Vue3應(yīng)用中凈化HTML、防御XSS攻擊的強(qiáng)大工具,通過(guò)白名單過(guò)濾和自定義鉤子實(shí)現(xiàn)高級(jí)配置,確保輸出安全內(nèi)容,感興趣的可以了解一下

一、快速入門(mén)

1.1 DOMPurify 概述

在 JavaScript 開(kāi)發(fā)的世界中,安全性是保護(hù)應(yīng)用程序免受潛在威脅和漏洞的至關(guān)重要。在 Vue 3 應(yīng)用中渲染動(dòng)態(tài) HTML 內(nèi)容時(shí),安全風(fēng)險(xiǎn)不容忽視。DOMPurify 是一個(gè)開(kāi)源的基于 DOM 的快速 XSS 凈化工具,專門(mén)用于凈化HTML、MathML和SVG,能有效防御跨站腳本攻擊(XSS攻擊)。它通過(guò)解析遞歸元素節(jié)點(diǎn)來(lái)凈化 HTML,輸出安全的 HTML 內(nèi)容,能夠有效抵御防止XSS攻擊。

1.2 DOMPurify 核心思路

DOMPurify 的核心思想是:不要自己寫(xiě) HTML 解析器,而是讓瀏覽器來(lái)解析。

1.3 安裝與引入

可以通過(guò) npm 來(lái)安裝 DOMPurify 庫(kù),命令如下:

# 確認(rèn)安裝版本(含嵌套依賴)
npm install dompurify
# 或者
yarn add dompurify

在需要使用 DOMPurify 的文件中導(dǎo)入 DOMPurify 庫(kù),代碼如下:

import DOMPurify from 'dompurify';

1.4 基礎(chǔ)用法

使用 DOMPurify 庫(kù)過(guò)濾 HTML 非常簡(jiǎn)單,可以直接調(diào)用 DOMPurify.sanitize() 方法,將需要過(guò)濾的HTML字符串作為參數(shù)傳入,然后它就會(huì)返回一個(gè)消毒過(guò)的版本。比如,在表單的提交中,或者需要根據(jù)用戶改變html內(nèi)容的時(shí)候,凈化字符串,放置隱藏惡意腳本。代碼示例如下:

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過(guò)濾前:', rawHtml)
console.log('DOMPurify過(guò)濾后:', DOMPurify.sanitize(html))

在上面的示例中,我們嘗試注入一段 JavaScript 代碼。然而,DOMPurify 檢測(cè)到此并刪除它,使得輸出的 HTML 代碼是安全的。

二、DOMPurify 高級(jí)配置

DOMPurify 不僅支持簡(jiǎn)單的清洗操作,它還提供了詳細(xì)的配置選項(xiàng),使得開(kāi)發(fā)人員能夠通過(guò)配置選項(xiàng)自定義凈化規(guī)則,以滿足不同的安全需求。

2.1 白名單過(guò)濾

可以定義一個(gè)配置對(duì)象來(lái)指定自定義允許的標(biāo)簽和屬性。

const config = {
  // 只允許這些HTML標(biāo)簽
  ALLOWED_TAGS: ['p', 'a', 'b', 'i', 'em', 'strong'],
  // 只允許這些HTML屬性
  ALLOWED_ATTR: ['href', 'title', 'target'],
  // 允許自定義URI的協(xié)議
  ALLOWED_URI_REGEXP: /^(https?|ftp):/i
  // 禁止的危險(xiǎn)屬性
  FORBID_ATTR: ['onclick', 'onload']
};

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

2.2 自定義鉤子

DOMPurify 支持在凈化流程的不同階段插入自定義邏輯,實(shí)現(xiàn)高度定制化的安全策略,允許我們?cè)趦艋^(guò)程中進(jìn)行更細(xì)粒度的控制。

鉤子函數(shù)簡(jiǎn)要說(shuō)明
beforeSanitizeElements在清理元素前觸發(fā),可用于提前移除某些節(jié)點(diǎn)或?qū)傩?/td>
afterSanitizeElements對(duì)節(jié)點(diǎn)進(jìn)行基礎(chǔ)清理之后觸發(fā),常用于處理鏈接安全、圖片防盜鏈、強(qiáng)制 HTTPS
uponSanitizeShadowNode
beforeSanitizeAttributes
afterSanitizeAttributes在清理屬性后觸發(fā)
beforeSanitizeShadowDOM
afterSanitizeShadowDOM
uponSanitizeElement當(dāng)遍歷到具體的 HTML 元素時(shí)觸發(fā),可以用來(lái)記錄日志、監(jiān)控被攔截的危險(xiǎn)標(biāo)簽
uponSanitizeAttribute在處理具體屬性時(shí)觸發(fā),常用于校驗(yàn) URL 協(xié)議,防止執(zhí)行惡意的 JavaScript 代碼

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

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

三、最佳實(shí)踐

3.1 查看被移除的內(nèi)容

在進(jìn)行安全審計(jì)或調(diào)試時(shí),可能需要知道 DOMPurify 移除了哪些內(nèi)容:

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

// 查看被移除的節(jié)點(diǎn)
console.log(DOMPurify.removed);

請(qǐng)注意,DOMPurify.removed 主要用于調(diào)試,不建議在生產(chǎn)環(huán)境中依賴它進(jìn)行業(yè)務(wù)邏輯判斷。

3.2 結(jié)合Vue響應(yīng)式數(shù)據(jù)

通常,我們還會(huì)將 DOMPurify 與 Vue 的響應(yīng)式系統(tǒng)(如 ref、computed)結(jié)合使用:

<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="輸入內(nèi)容"></textarea>
  <div v-html="sanitizedInput"></div>
</template>

3.3 使用自定義指令

為了更方便地在模板中使用,可以創(chuàng)建一個(gè)自定義指令:

// 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>

四、總結(jié)

當(dāng)今數(shù)字時(shí)代,安全性在應(yīng)用程序開(kāi)發(fā)中變得愈發(fā)重要。為了確保用戶數(shù)據(jù)的保密性、完整性和可靠性,開(kāi)發(fā)人員需要采取各種措施來(lái)應(yīng)對(duì)安全挑戰(zhàn)。DOMPurify 是 Vue 3 應(yīng)用中處理不安全 HTML 并防御 XSS 攻擊的強(qiáng)力工具。通過(guò)其簡(jiǎn)單的 API 和靈活的配置,它可以滿足多種安全需求。關(guān)鍵在于牢記安全需要多層防御,切勿完全依賴客戶端凈化。

到此這篇關(guān)于Vue3使用DOMPurify防御XSS攻擊的文章就介紹到這了,更多相關(guān)Vue3 DOMPurify防御XSS攻擊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue版日歷組件的實(shí)現(xiàn)方法

    vue版日歷組件的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了vue版日歷組件的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue如何整合mavon-editor編輯器(markdown編輯和預(yù)覽)

    Vue如何整合mavon-editor編輯器(markdown編輯和預(yù)覽)

    這篇文章主要介紹了Vue整合mavon-editor編輯器(markdown編輯和預(yù)覽)的相關(guān)知識(shí),mavon-editor是目前比較主流的markdown編輯器,重點(diǎn)介紹它的使用方法,需要的朋友可以參考下
    2022-10-10
  • 解決el-menu標(biāo)題過(guò)長(zhǎng)顯示不全問(wèn)題

    解決el-menu標(biāo)題過(guò)長(zhǎng)顯示不全問(wèn)題

    本文主要介紹了如何解決el-menu標(biāo)題過(guò)長(zhǎng)顯示不全問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • vue使用axios獲取不到響應(yīng)頭Content-Disposition的問(wèn)題及解決

    vue使用axios獲取不到響應(yīng)頭Content-Disposition的問(wèn)題及解決

    這篇文章主要介紹了vue使用axios獲取不到響應(yīng)頭Content-Disposition的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • vue3配置全局參數(shù)(掛載全局方法)以及組件的使用

    vue3配置全局參數(shù)(掛載全局方法)以及組件的使用

    這篇文章主要介紹了vue3配置全局參數(shù)(掛載全局方法)以及組件的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 前端vue項(xiàng)目打包為war包的實(shí)現(xiàn)示例

    前端vue項(xiàng)目打包為war包的實(shí)現(xiàn)示例

    本文介紹將前端項(xiàng)目打包為war包的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • Vue3視頻播放組件 vue3-video-play使用方式

    Vue3視頻播放組件 vue3-video-play使用方式

    vue3-video-play是Vue3的視頻播放組件,基于原生video標(biāo)簽開(kāi)發(fā),支持MP4和HLS流,提供全局/局部引入方式,可監(jiān)聽(tīng)播放、暫停等事件,并具備字幕、播放列表等高級(jí)功能,適合靈活配置需求
    2025-09-09
  • el-element中el-table表格嵌套el-select實(shí)現(xiàn)動(dòng)態(tài)選擇對(duì)應(yīng)值功能

    el-element中el-table表格嵌套el-select實(shí)現(xiàn)動(dòng)態(tài)選擇對(duì)應(yīng)值功能

    這篇文章主要給大家介紹了關(guān)于el-element中el-table表格嵌套el-select實(shí)現(xiàn)動(dòng)態(tài)選擇對(duì)應(yīng)值功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-01-01
  • vue 封裝面包屑組件教程

    vue 封裝面包屑組件教程

    這篇文章主要介紹了vue 封裝面包屑組件教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • vue-cli腳手架config目錄下index.js配置文件的方法

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

    下面小編就為大家分享一篇vue-cli腳手架config目錄下index.js配置文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03

最新評(píng)論

遂溪县| 苏尼特左旗| 旅游| 石河子市| 郸城县| 广东省| 江津市| 巴楚县| 唐河县| 乌审旗| 米易县| 浑源县| 特克斯县| 昭通市| 开封市| 白沙| 本溪市| 大埔县| 花莲县| 新野县| 九江县| 兰州市| 阿拉善右旗| 南丹县| 平远县| 鲁甸县| 苍山县| 齐河县| 磐石市| 石台县| 福鼎市| 靖安县| 泗阳县| 寿阳县| 巴青县| 四会市| 临清市| 江津市| 卓资县| 宝山区| 阳城县|