關于Web前端安全之XSS攻擊防御增強方法

僅依賴前端驗證是無法完全防止 XSS的,還需要增強后端驗證,使用DOMPurify凈化 HTML 時,還需要平衡安全性與業務需求。

一、僅依賴前端驗證無法完全防止 XSS 的原因及后端驗證的重要性

1. 前端驗證的局限性

前端驗證(如 JavaScript 輸入檢查)可以提升用戶體驗,但無法作為安全防護的核心,原因如下:

前端代碼可被篡改:

攻擊者可通過瀏覽器開發者工具禁用或修改前端驗證邏輯,直接向服務器發送惡意數據。

繞過前端提交:

攻擊者可通過 curl、Postman 等工具直接構造 HTTP 請求,完全繞過前端頁面的驗證邏輯。

場景覆蓋不全:

前端驗證可能僅針對可見輸入(如表單),而忽略其他數據來源(如 URL 參數、Cookie、第三方接口返回數據)。

2. 后端驗證的核心價值

后端驗證是防御 XSS 的最后一道防線,其重要性體現在:

不可繞過性:

所有用戶輸入(無論來源)最終都需經過服務器處理,后端驗證可確保惡意數據在進入存儲或渲染流程前被攔截。

一致性:

后端驗證可統一處理多端(Web、App、第三方接口)的輸入,避免因前端實現差異導致的防護漏洞。

全生命周期防護:

后端驗證不僅覆蓋輸入階段,還能在數據存儲、跨系統傳輸、渲染輸出等全流程中生效,確保數據始終處于安全狀態。

二、三種常見的 HTML 轉義方法及適用場景

1.HTML 實體轉義(核心轉義)

  • 轉義規則:將 < 轉為 &lt;,> 轉為 &gt;,& 轉為 &amp;," 轉為 &quot;,' 轉為 &#39;。
  • 適用場景:所有動態數據插入 HTML 標簽內容或屬性時(如 <div>{{ 轉義后的數據 }}</div> 或 <input value="{{ 轉義后的數據 }}">)。
  • 示例:用戶輸入 <script>alert(1)</script> 轉義后變為 &lt;script&gt;alert(1)&lt;/script&gt;,僅作為文本顯示。

2.encodeURIComponent

  • 作用:對 URL 中的參數進行編碼,將特殊字符(如 ?、&、=、空格等)轉換為 %XX 形式的 URL 編碼。
  • 適用場景:動態生成 URL 參數時(如拼接查詢字符串、跳轉鏈接)。
  • 示例:用戶輸入 a&b=c 經 encodeURIComponent 處理后變為 a%26b%3Dc,避免破壞 URL 結構或注入惡意參數。

3.textContent(DOM API 安全輸出)

  • 作用:通過 JavaScript 的 textContent 屬性設置元素內容,自動將所有內容視為純文本,不解析 HTML。
  • 適用場景:前端動態插入文本內容時(替代 innerHTML)。
  • 示例:element.textContent = userInput 會將 <script> 直接顯示為文本,而非執行腳本。

三、使用 DOMPurify 時平衡安全性與業務需求的策略

DOMPurify 是一款強大的 HTML 凈化庫,可過濾惡意標簽和屬性,但業務中常需允許特定標簽(如富文本中的 <b>、<img>)。平衡兩者的核心是最小權限原則:僅開放必要功能,同時嚴格限制風險點。

1. 基礎配置:默認嚴格模式

DOMPurify 默認已過濾絕大多數危險內容(如 <script>、onclick、javascript: 協議),直接使用即可覆蓋大部分場景:

import DOMPurify from 'dompurify';const safeHtml = DOMPurify.sanitize(userInput); // 默認配置:過濾危險內容

2. 允許特定標簽和屬性(按需開放)

若業務需要支持富文本(如允許 <b>、<i>、<a>、<img>),可通過配置精細控制:

// 允許 <b>、<i>、<a>、<img>,并限制 <a> 和 <img> 的屬性
const safeHtml = DOMPurify.sanitize(userInput, {ADD_TAGS: ['b', 'i', 'a', 'img'], // 額外允許的標簽(默認已允許部分安全標簽)ADD_ATTR: ['href', 'src', 'alt'], // 額外允許的屬性ALLOW_UNKNOWN_PROTOCOLS: false,   // 禁止非標準協議(如 javascript:)ALLOW_SELF_CLOSE_IN_ATTR: false,  // 禁止屬性中的自閉合語法(避免繞過)// 限制 <a> 標簽的 href 僅允許 http/https 協議CHECK_PROTOCOL: true,// 自定義過濾邏輯:例如限制 <img> 的 src 僅來自可信域名beforeSanitizeElements: (node) => {if (node.tagName === 'IMG' && node.src) {const allowedDomains = ['trusted-cdn.com', 'example.com'];const srcDomain = new URL(node.src).hostname;if (!allowedDomains.includes(srcDomain)) {node.src = ''; // 清空不可信圖片地址}}}
});

3. 禁止高風險功能

無論業務需求如何,必須禁用以下高風險特性:

  • 事件屬性(onclick、onerror、onload 等):可能觸發惡意腳本。
  • javascript:、data: 等危險協議:避免通過 <a href="javascript:xxx"> 執行腳本。
  • iframe、video 等嵌入標簽:除非明確信任來源,否則禁止使用。

4. 定期更新與測試

  • 保持 DOMPurify 版本最新,及時修復已知漏洞。
  • 對業務允許的標簽和屬性進行安全測試(如嘗試注入 onerror 事件),驗證過濾效果。

總結

  • 前端驗證僅為輔助,后端驗證是 XSS 防御的核心,因其不可繞過且覆蓋全流程。
  • HTML 實體轉義、encodeURIComponent、textContent 分別適用于 HTML 內容、URL 參數、前端文本插入場景。
  • 使用 DOMPurify 時,需通過最小權限配置允許必要標簽,同時禁用高風險特性,并結合業務測試確保安全與功能的平衡。

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

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

相關文章

消息系統技術文檔

消息系統技術文檔 概述 本文檔詳細說明了如何在現有的LHD通信系統中添加自己的消息類型&#xff0c;包括消息的發送、接收、解析和處理的完整流程。 系統架構 消息流程架構圖 #mermaid-svg-My7ThVxSl6aftvWK {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博輿情數據可視化分析-熱詞情感趨勢樹形圖

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博輿情數據可視化分析-熱詞情感趨勢樹形圖…

8月4日 強對流天氣藍色預警持續:多地需警惕雷暴大風與短時強降水

中央氣象臺8月4日10時繼續發布強對流天氣藍色預警,提醒廣大民眾注意防范即將到來的惡劣天氣。 預警詳情: 時間范圍: 8月4日14時至5日14時 影響區域: 雷暴大風或冰雹: 西北地區中東部、華北中北部、華南南部等地,風力可達8級以上。 短時強降水: 西北地區中東部、華北、…

C語言數據結構(4)單鏈表專題2.單鏈表的應用

1. 鏈表經典算法——OJ題目 1.1 單鏈表相關經典算法OJ題1&#xff1a;移除鏈表元素 1.2 單鏈表相關經典算法OJ題2&#xff1a;反轉鏈表 1.3 單鏈表相關經典算法OJ題3&#xff1a;合并兩個有序鏈表 1.4 單鏈表相關經典算法OJ題4&#xff1a;鏈表的中間結點 1.5 循環鏈表…

Shell 腳本發送信號給 C 應用程序,讓 C 應用程序回收線程資源后自行退出。

下面分別給出一個 Shell 腳本和 C 程序的例子&#xff0c;實現通過 Shell 腳本發送信號給 C 應用程序&#xff0c;讓 C 應用程序回收線程資源后自行退出。原理在 Linux 系統中&#xff0c;我們可以使用信號機制來實現進程間的通信。Shell 腳本可以使用 kill 命令向指定的進程發…

C++入門自學Day6-- STL簡介(初識)

往期內容回顧 C模版 C/C內存管理&#xff08;初識&#xff09; C/C內存管理&#xff08;續&#xff09; STL簡介&#xff1a; STL 是 C 標準庫的重要組成部分&#xff0c;是一個通用程序設計的模板庫&#xff0c;用于數據結構和算法的復用。它極大地提升了代碼效率、可靠性…

從零開始搞定類與對象(中)

運算符重載1.當運算符被用于類類型的對象時&#xff0c;C語言允許我們通過運算符重載的形式指定新的含義。C規定類類型對象使用運算符時&#xff0c;必須轉換成調用對應運算符重載&#xff0c;若沒有對應的運算符重載&#xff0c;則會編譯報錯。2. 運算符重載是具有特殊名字的函…

SpringMVC實戰指南:從環境搭建到功能實現全解析

第一章&#xff1a;SpringMVC環境搭建與基礎配置1.1 Maven依賴配置在Maven項目中&#xff0c;SpringMVC的依賴配置是開發的第一步。根據Spring官方推薦&#xff0c;以下是SpringMVC 5.3.x版本的Maven依賴配置&#xff1a;<dependencies><!-- Spring MVC核心依賴 -->…

Repo 與 manifest

Manifest&#xff1a;它本身就是一個 git 倉庫&#xff0c;其中存放的都是包含倉庫和子倉庫信息的XML文件。這些文件全部由開發者或者維護者手動配置并自己上傳到 git 倉庫。另外&#xff1a;Manifest 中的倉庫之間的依賴關系 repo 也并不關心。所以它們可以是同級的也可以是包…

深入淺出 RabbitMQ:簡單隊列實戰指南

大家好&#xff0c;我是工藤學編程 &#x1f989;一個正在努力學習的小博主&#xff0c;期待你的關注實戰代碼系列最新文章&#x1f609;C實現圖書管理系統&#xff08;Qt C GUI界面版&#xff09;SpringBoot實戰系列&#x1f437;【SpringBoot實戰系列】SpringBoot3.X 整合 Mi…

Ubuntu22-Qt Creator-fcitx-中文輸入

fcitx在ubuntu系統中路徑 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/ /usr/lib/x86_64-linux-gnu/qt6/plugins/platforminputcontexts/ fcitx-qt5-1.2.7 編譯 下載鏈接:https://github.com/fcitx/fcitx-qt5/archive/refs/tags/1.2.7.zip Qt版本:Qt C…

【Java基礎|第十三篇】面向對象基礎(三)——繼承(一)繼承的理解,實現,特點……

&#xff08;四&#xff09;面向對象&#xff1a; 5、繼承&#xff1a; &#xff08;1&#xff09;理解&#xff1a; 概念&#xff1a; 繼承是面向對象的三大特征之一 繼承是類與類之間關系的一種&#xff08;是父類與子類的關系&#xff09; 使用場景&#xff1a; 一個類與另…

QGIS綠色版吉林一號切片體驗版插件(Jilin1Tiles)更新

吉林一號更新2024年圖源了但吉林一號切片體驗版插件&#xff08;Jilin1Tiles&#xff09;還沒有更新&#xff0c;我修改了一下代碼&#xff0c;直接集成到QGIS綠色版中。如下&#xff1a;注意&#xff1a;第一次使用的時候需要選中啟用一下插件&#xff1a;需要使用的可以直接下…

git操作命令和golang編譯腳本

git子模塊信息處理命令git init submodule git submodule updategit取消合并 git merge --abort git reset --hard HEAD{1}bat文件生成二進制set GOOSlinux set GOARCHamd64 go env -w GOFLAGS-modvendor go build -ldflags "-w -s" -ohallapiset GOOSlinux set GOAR…

通往L4之路:構建自我進化的智能駕駛決策大腦

摘要&#xff1a; 本文旨在提出一個超越當前主流“感知-預測-規劃”分離式架構的下一代自動駕駛決策系統方案。面對自動駕駛領域最核心的“長尾場景”難題&#xff0c;本文借鑒并升華了一套源于復雜策略制定的決策智能框架&#xff0c;通過構建動態駕駛世界模型&#xff08;Dyn…

AI編程助手:終結996的新希望

引言程序員工作現狀與“996”現象的普遍性AI技術快速發展對編程效率的潛在影響核心問題&#xff1a;AI IDE與AI輔助編程能否改變傳統開發模式AI IDE與AI輔助編程的核心技術AI IDE的定義與功能&#xff08;代碼補全、錯誤檢測、自動重構等&#xff09;AI輔助編程工具&#xff08…

Anthropic 禁止 OpenAI 訪問 Claude API:商業競爭與行業規范的沖突

Anthropic 禁止 OpenAI 訪問 Claude API&#xff1a;商業競爭與行業規范的沖突 文章來源&#xff1a;Poixe AI 本周&#xff0c;美國 AI 公司 Anthropic 宣布禁止 OpenAI 通過 API 訪問其 Claude 系列大模型。這一舉動引發了行業對"友好基準測試"與商業競爭邊界的熱…

區塊鏈 + 物聯網落地案例:供應鏈溯源系統開發全記錄

本文詳細記錄了區塊鏈與物聯網技術融合的供應鏈溯源系統開發全流程。從項目背景出發&#xff0c;闡述傳統供應鏈溯源痛點&#xff0c;介紹系統開發的技術架構設計&#xff0c;包括物聯網數據采集層、區塊鏈數據存儲層等核心模塊&#xff0c;詳解硬件選型、智能合約編寫、數據上…

Windows環境下Intel Fortran如何安裝配置NetCDF

NetCDF(Network Common Data Form)格式,簡稱nc格式,是一種自描述、與平臺無關的二進制數據文件,特別適合多維數據的存儲和交換,廣泛應用于氣象、海洋、地球科學等領域。本文介紹Windows環境下IntelFortran安裝配置NetCDF的過程。 一、系統環境及準備工作 1. 系統 Wind…

tcp/udp的socket特點

tcp &#xff1a; 綁定一個 socket 只是用來監聽&#xff0c;accept 對每個客戶端生成一個 socket 用來維護滑動窗口等。每個客戶端用一個 socket 用來維護滑動窗口等。 4 次揮手對應兩次 close 的 fin 和返回的 ack。 而三次揮手在 connect 里阻塞完成。 ?udp &#xff1a; 雙…