關于Web前端安全防御XSS攻防的幾點考慮

作為一位前端老鳥,總結一下web前端安全領域基礎概念防御策略框架實踐新興技術等幾個維度的考慮。

一、基礎概念與核心漏洞

1.XSS 攻擊

XSS跨站腳本攻擊)是 Web 前端安全中最常見的威脅之一,其核心是攻擊者將惡意腳本注入到網頁中,當用戶訪問該網頁時,腳本被執行,從而竊取用戶信息、篡改頁面內容等。根據攻擊腳本的注入方式和執行時機,XSS 主要分為以下三種類型:

一、存儲型 XSS(Persistent XSS)

存儲型 XSS 是最危險的 XSS 類型之一,惡意腳本會被永久存儲在目標服務器(如數據庫、留言板、用戶個人資料等)中。當其他用戶訪問包含該惡意腳本的頁面時,腳本會從服務器加載并執行。

攻擊場景示例:

某論壇允許用戶發布評論,且未對評論內容進行過濾。攻擊者在評論區輸入:

<script>alert(document.cookie)</script>

該惡意腳本被論壇服務器存儲到數據庫中。當其他用戶瀏覽該帖子時,服務器會從數據庫讀取這條評論并渲染到頁面上,導致<script>標簽內的代碼在用戶瀏覽器中執行,竊取用戶的 Cookie(可能包含登錄憑證)。

二、反射型 XSS(Reflected XSS)

反射型 XSS 的惡意腳本不會被存儲,而是通過URL 參數、表單提交等方式傳遞給服務器,服務器處理后將腳本 “反射” 回頁面并執行。其特點是一次性攻擊,需誘導用戶點擊包含惡意腳本的鏈接。

攻擊場景示例:

某網站的搜索功能會將用戶輸入的關鍵詞顯示在結果頁,且未過濾輸入。攻擊者構造如下 URL:

https://example.com/search?keyword=<script>alert('XSS')</script>

當用戶點擊該鏈接時,服務器會將keyword參數的值直接嵌入到頁面中,導致<script>標簽內的代碼執行,彈出 “XSS” 提示。若腳本更復雜(如發送用戶信息到攻擊者服務器),則可能造成信息泄露。

三、DOM 型 XSS(DOM-based XSS)

DOM 型 XSS 與前兩種類型的區別在于:惡意腳本的執行不經過服務器處理,而是通過瀏覽器的 DOM 解析直接觸發。攻擊者利用頁面中 JavaScript 對 DOM 的操作漏洞(如使用innerHTML、document.write等方法處理不可信數據),注入惡意代碼。

攻擊場景示例:

某網站的 JavaScript 代碼會從 URL 的hash部分讀取內容并插入到頁面中:

var userInput = location.hash.slice(1); // 獲取URL中#后的內容
document.getElementById('content').innerHTML = userInput; // 將內容插入頁面

攻擊者構造如下鏈接誘導用戶點擊:

https://example.com/page#<img src=x onerror=alert(document.cookie)>

用戶點擊后,瀏覽器解析 URL 時,location.hash的值為<img src=x οnerrοr=alert(document.cookie)>,JavaScript 代碼會將該內容通過innerHTML插入頁面,導致onerror事件觸發,執行惡意代碼竊取 Cookie。

反射型 XSS 攻擊與 DOM 型 XSS攻擊 的核心區別是什么?防御方式有何不同?

反射型 XSS 與 DOM 型 XSS 雖然都屬于跨站腳本攻擊,但在攻擊路徑觸發機制防御策略上存在本質區別,具體如下:

一、反射型 XSS 攻擊與 DOM 型 XSS攻擊核心區別
1. 攻擊路徑不同

反射型 XSS:惡意腳本的執行依賴服務器參與。
攻擊者構造的惡意腳本會作為請求參數(如 URL 參數、表單數據)發送到服務器,服務器處理后將腳本 “反射” 到響應頁面中,最終在用戶瀏覽器中執行。
流程:攻擊者構造惡意 URL → 用戶訪問 → 服務器解析參數并返回含惡意腳本的頁面 → 瀏覽器執行腳本

DOM 型 XSS:完全在客戶端(瀏覽器)完成,不經過服務器處理。
惡意腳本通過 URL 等方式傳入后,直接被頁面中的 JavaScript 代碼讀取并操作 DOM(如通過 innerHTML、eval 等方法),導致腳本執行。
流程:攻擊者構造惡意 URL → 用戶訪問 → 瀏覽器解析 URL 并執行本地 JS → JS 將惡意腳本插入 DOM → 瀏覽器執行腳本

2. 數據處理位置不同
  • 反射型 XSS 的惡意數據會經過服務器處理(如嵌入 HTML 響應中),因此在服務器的響應內容中可以直接看到惡意腳本。
  • DOM 型 XSS 的惡意數據從未經過服務器,服務器返回的 HTML 是 “干凈的”,惡意腳本僅存在于客戶端的 DOM 操作邏輯中。
3. 可見性不同
  • 反射型 XSS 的惡意腳本會出現在服務器返回的 HTML 源碼中,通過 “查看頁面源代碼” 可直接觀察到。
  • DOM 型 XSS 的惡意腳本不會出現在原始 HTML 源碼中,僅在瀏覽器執行 JS 后通過 DOM 動態生成,需通過 “檢查元素”(查看渲染后的 DOM)才能看到。
二、反射型 XSS 攻擊與 DOM 型 XSS攻擊防御方式的差異

雖然兩者的核心防御原則都是 “對不可信數據進行安全處理”,但防御的側重點不同:

1. 反射型 XSS 的防御

由于惡意腳本經過服務器處理,防御需在服務器端和客戶端共同發力

服務器端過濾 / 轉義:對所有用戶輸入的參數(如 URL 參數、表單數據)進行嚴格過濾,根據輸出場景進行轉義(如輸出到 HTML 中時,將 < 轉義為 &lt;,> 轉義為 &gt; 等)。
使用 HTTP 安全頭:啟用 CSP(內容安全策略),限制頁面中腳本的加載和執行來源(如只允許加載本站腳本)。
避免將用戶輸入直接嵌入 HTML:盡量使用文本節點(如 textContent)而非 innerHTML 輸出數據。

2. DOM 型 XSS 的防御

由于惡意腳本僅在客戶端處理,防御需聚焦于前端 JavaScript 代碼

避免危險的 DOM 操作:禁用或謹慎使用 innerHTML、outerHTML、document.write()、eval() 等可直接執行 HTML / 腳本的方法,優先使用 textContent 等安全 API。
前端輸入驗證與轉義:對從 URL(如 location.search、location.hash)、localStorage 等客戶端來源獲取的數據,在插入 DOM 前進行轉義(如使用 encodeURIComponent 或專用庫轉義 HTML 特殊字符)。
限制動態代碼執行:避免使用 setTimeout(string)、setInterval(string) 等以字符串形式執行代碼的方法,改用函數形式(如 setTimeout(() => { ... }))。

為什么 React/Vue 等框架默認能減少 XSS 風險?在使用dangerouslySetInnerHTML或v-html時應注意什么?

React、Vue 等現代前端框架之所以能默認減少 XSS 風險,核心在于它們對動態數據的渲染機制進行了安全設計,從根源上避免了不可信數據被直接解析為 HTML / 腳本。而 dangerouslySetInnerHTML(React)和 v-html(Vue)是框架提供的 “不安全” 接口,用于繞過默認安全機制渲染 HTML,使用時需格外謹慎。

一、React/Vue框架默認減少 XSS 風險的原因

框架通過自動轉義動態數據和限制危險的 DOM 操作,從渲染層面阻斷了惡意腳本的執行,具體機制如下:

1. 自動轉義 HTML 特殊字符

當框架將動態數據(如變量、用戶輸入)插入到 DOM 中時,會默認將 HTML 特殊字符(如?<>&"'?等)轉義為對應的實體編碼,避免其被解析為 HTML 標簽或腳本。

  • 例如,在 React 中渲染 <div>{userInput}</div> 時,若 userInput 的值為 <script>alert('XSS')</script>,框架會自動將其轉義為 &lt;script&gt;alert(&#39;XSS&#39;)&lt;/script&gt;,最終在頁面中顯示為純文本,而非可執行的腳本。
  • Vue 中使用 {{ userInput }} 插值時,同樣會對內容進行轉義,確保動態數據僅作為文本渲染。
2. 避免直接操作危險 DOM API

框架內部通過 Virtual DOM 管理頁面渲染,避免了開發者直接使用 innerHTML、document.write 等危險 API(這些 API 是 DOM 型 XSS 的常見誘因)。開發者通過框架提供的聲明式語法(如 JSX、模板指令)操作視圖,無需手動拼接 HTML,從流程上減少了 XSS 漏洞的產生。

二、使用 dangerouslySetInnerHTML 或 v-html 時的注意事項

dangerouslySetInnerHTML(React)和 v-html(Vue)的作用是將動態數據作為原始 HTML 直接插入到 DOM 中,此時框架會關閉自動轉義機制,若使用不當,會直接引入 XSS 風險。使用時需遵循以下原則:

1. 僅對完全可信的數據使用
  • 必須確保插入的 HTML 內容完全由開發者控制(如后端接口返回的經過嚴格過濾的安全內容),絕對不能包含用戶輸入的原始數據(如評論、留言、個人資料等不可信內容)。
  • 示例:若后端返回的富文本內容已通過安全過濾(如僅允許 <b>、<i> 等無害標簽),可謹慎使用;若內容包含用戶提交的原始字符串,則嚴禁使用。
2. 對不可信內容進行嚴格過濾和凈化

若確實需要插入包含用戶輸入的 HTML(如允許用戶提交有限的富文本),必須通過專業的 HTML 過濾庫對內容進行凈化,僅保留安全的標簽和屬性。

  • 推薦工具:DOMPurify(適用于 React、Vue 等所有框架),它能有效過濾惡意標簽(如 <script>)、事件屬性(如 onclick、onerror)和危險協議(如 javascript:)。
  • 示例(React + DOMPurify):
import DOMPurify from 'dompurify';function MyComponent({ userInput }) {// 凈化用戶輸入的 HTMLconst safeHtml = DOMPurify.sanitize(userInput);return <div dangerouslySetInnerHTML={{ __html: safeHtml }} />;
}
3. 限制允許的標簽和屬性

即使使用過濾庫,也應根據業務需求最小化允許的標簽和屬性(如富文本場景僅允許 <p>、<img>、<a> 等必要標簽,且 <a> 標簽僅允許 href 屬性,同時過濾 javascript: 協議)。

示例(DOMPurify 配置):

// 僅允許 <b>、<i> 標簽和 <a> 標簽的 href 屬性(且禁止 javascript: 協議)
const safeHtml = DOMPurify.sanitize(userInput, {ADD_TAGS: ['b', 'i', 'a'],ADD_ATTR: ['href'],ALLOW_UNKNOWN_PROTOCOLS: false, // 禁止未知協議ALLOW_JAVASCRIPT_PROTOCOL: false // 禁止 javascript: 協議
});
4. 避免拼接動態數據生成 HTML

絕對不要將用戶輸入的數據與靜態 HTML 拼接后再傳入 dangerouslySetInnerHTML 或 v-html,拼接過程中可能因過濾不徹底引入漏洞。

錯誤示例:

// 危險!拼接用戶輸入可能導致 XSS
const unsafeHtml = `<div>${userInput}</div>`; 
return <div dangerouslySetInnerHTML={{ __html: unsafeHtml }} />;

React、Vue 等框架通過自動轉義動態數據封裝危險 DOM 操作,默認阻斷了大部分 XSS 攻擊路徑。而 dangerouslySetInnerHTML 和 v-html 是為特殊場景(如渲染富文本)設計的 “逃生通道”,使用時必須確保內容完全可信或經過嚴格凈化,否則會直接暴露 XSS 風險。核心原則:除非萬不得已,否則不使用這些接口;若必須使用,務必通過專業工具過濾所有不可信內容。

總結

三種 XSS 的核心差異在于惡意腳本的 “生命周期” 和執行路徑:

  • 存儲型:腳本存儲在服務器,隨頁面加載執行;
  • 反射型:腳本通過 URL / 表單傳遞,經服務器反射后執行;
  • DOM 型:腳本僅在瀏覽器 DOM 中處理,不經過服務器。

防御 XSS 的核心原則是:對所有不可信數據進行嚴格過濾和轉義(如將<轉義為&lt;),避免使用危險的 DOM 操作方法,同時啟用 CSP(內容安全策略)限制腳本執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91548.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

eSIM技術深度解析:從物理芯片到數字革命

當蘋果公司在2018年首次在iPhone XS系列中引入eSIM技術時&#xff0c;許多用戶可能并未意識到這個看似微小的改變將帶來怎樣的技術革命。從1991年第一張信用卡大小的SIM卡&#xff0c;到今天僅有5mm x 5mm的eSIM芯片&#xff0c;這不僅僅是尺寸的縮小&#xff0c;更是移動通信技…

通俗易懂解釋Java8 HashMap

我們來用通俗易懂的方式解釋一下 Java 8 中 HashMap 的原理&#xff0c;讓你對它的結構、運行機制有清晰的理解。&#x1f333; 什么是 HashMap&#xff1f; HashMap 是 Java 中非常常用的數據結構&#xff0c;用于存儲鍵值對&#xff08;key-value&#xff09;。你可以把它理解…

macOS安裝配置Unbound DNS完整指南

文章目錄macOS安裝配置Unbound DNS完整指南&#x1f3af; 為什么選擇Unbound&#xff1f;&#x1f4cb; 系統要求&#x1f680; 安裝步驟1. 使用Homebrew安裝2. 查看安裝信息?? 基礎配置1. 備份默認配置2. 創建基礎配置文件3. 基礎配置內容配置53端口版本&#xff08;高級用戶…

學習模板元編程(2)std::true_type/false_type

目錄 實現原理 應用場景 條件編譯 通過特化和繼承&#xff0c;實現std::is_xxx系列 思路 舉例 例子1&#xff0c;is_bool 例子2&#xff0c;is_ptr 實現原理 std::true_type/false_type是模板intergral_constant的兩種實現&#xff1a; using true_type integral_co…

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models論文閱讀筆記

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 摘要 本文探索了思維鏈&#xff08;chain of thought&#xff09;&#xff0c;即一系列中間推理過程&#xff0c;可以有效地增強大語言模型的復雜推理能力。 在三個大型語言模型上的實驗表明&#xff0…

華為核心交換機S7700的內存OID

華為S7700系列交換機 SNMP內存相關OID說明 以下列出了華為S7700核心交換機在SNMP v2c下可用的內存相關OID,包括CPU內存利用率、物理內存總量、已用內存和空閑內存,并給出每個OID的功能描述、數據類型、單位、使用說明等信息。 1. CPU內存利用率(處理器內存占用百分比) OID名…

中州養老Day02:服務管理護理計劃模塊

本日任務:服務管理的后端開發 1.學習:護理項目 (1)評估開發工期的思路和注意事項 全面熟悉項目,了解項目重點,設置開發優先級 比如,在下面圖片的接口文檔中版本有1.0,2.0,3.0也就是功能的初代,二代,三代,所以我們在大致瀏覽所有功能后,要優先關注初代功能的實現 開發計劃 …

JavaScript:Ajax(異步通信技術)

一、Ajax 核心概念Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一種異步通信技術&#xff0c;核心特點&#xff1a;無刷新更新&#xff1a;無需重新加載整個頁面異步處理&#xff1a;后臺發送/接收數據不阻塞用戶數據格式&#xff1a;支持 XML/JSON/HTML/純…

leetcode 118. 楊輝三角 簡單

給定一個非負整數 numRows&#xff0c;生成「楊輝三角」的前 numRows 行。在「楊輝三角」中&#xff0c;每個數是它左上方和右上方的數的和。示例 1:輸入: numRows 5 輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:輸入: numRows 1 輸出: [[1]]提示:1 < numRows…

jmeter--While控制器--循環直到接口響應符合條件

場景描述業務場景&#xff1a;單據計算接口情況&#xff1a;單據計算&#xff0c;調用接口1發起計算&#xff0c;接口2查詢計算執行結果jmeter腳本&#xff1a;把接口1和接口2&#xff08;接口2循環調用&#xff0c;直到返回執行完成狀態&#xff09;添加到一個事務&#xff0c…

組播 | 不同 VLAN 間數據轉發實現邏輯 / 實驗

注&#xff1a;本文為 “不同 vlan 間組播數據轉發” 相關合輯。 圖片清晰度受引文原圖所限。 略作重排&#xff0c;如有內容異常&#xff0c;請看原文。 組播 VLAN&#xff1a;解決路由器為不同 VLAN 用戶復制多份流量問題 aiaiai010101 于 2018-11-16 22:42:06 發布 一、組…

滲透測試常用指令

互聯網設備的開放信息查詢網站&#xff1a; https://fofa.info/ https://www.zoomeye.org/ https://quake.360.net/quake/#/index https://x.threatbook.com/v5/mapping https://hunter.qianxin.com/ 目錄 一、網絡探測與掃描 traceroute whatweb ping fping nc n…

51單片機串行通信的設計原理有哪些?

51單片機是指由美國INTEL公司生產的一系列單片機的總稱&#xff0c;這一系列單片機包括了許多品種&#xff0c;如8031&#xff0c;8051&#xff0c;8751&#xff0c;8032&#xff0c;8052&#xff0c;8752等&#xff0c;其中8051是最早最典型的產品&#xff0c;該系列其它單片機…

設計模式十四:適配器模式(Adapter Pattern)

適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&#xff0c;用于將一個類的接口轉換成客戶端期望的另一個接口&#xff0c;使原本不兼容的類可以一起工作。適配器模式的類型類適配器&#xff08;通過多重繼承實現&#xff09;對象適配器&#xff08;通…

力扣經典算法篇-38-組合(回溯算法)

1、題干 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 示例 1&#xff1a; 輸入&#xff1a;n 4, k 2 輸出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2&#xff1a; 輸入&#xff1a;…

多人命題系統

目 錄 摘 要 Abstract 1 系統概述 1.1 概述 1.2課題意義 1.3 主要內容 2 系統開發環境 2. 1 JAVA簡介 2. .2 B/S架構 2.3 SSM三大框架 2.4訪問數據庫實現方法 2.5 系統對MySQL數據庫的兩種連接方式 3 需求分析 3.1技術可行性&#xff1a;技術背景…

UDP_千兆光通信(四)Tri Mode Ethernet MAC ip核

Tri Mode Ethernet MAC ip核使用與例程分析 一、 Tri Mode Ethernet MAC ip核功能 二、 Tri Mode Ethernet MAC ip核配置 數據傳輸速率 主要設置接口 幀濾波功能選擇,以及流控選擇 三、 Tri Mode Ethernet MAC ip核使用 3.1 ip核接口 3.2 ip核接口說明 3.2.1 tx_ifg_delay 3.2…

Linux網絡:多路轉接 epoll

Linux網絡&#xff1a;多路轉接 epoll一、epoll三個接口函數1、epoll_create2、epoll_ctl3、epoll_wait二、epoll的工作原理三、epoll的echo_server1、EpollServer類2、構造函數3、事件循環4、事件派發5、事件處理6、測試四、LT和ET模式1、LT2、ET五、項目代碼一、epoll三個接口…

uniapp 微信小程序 列表點擊分享 不同的信息

<button open-type"share" plain class"item share" click.stop"shareFn(item)"><text>分享</text> </button>import {onShareAppMessage} from dcloudio/uni-applet shareObj ref({})// 將點擊后的分享設置信息 關鍵…

C# 匿名方法詳解

C# 匿名方法詳解 引言 在C#編程語言中,匿名方法是使用Lambda表達式創建的沒有名稱的方法。它們在LINQ查詢、事件處理和其他場合中非常有用。本文將詳細介紹C#匿名方法的基本概念、語法、使用場景以及優勢。 匿名方法的概念 匿名方法是一種無需顯式定義名稱的方法。在C#中,…