前端安全之DOMPurify基礎安裝與用法
前言
DOMPurify時一款專門用于防御XSS攻擊的庫,通過凈化HTML的內(nèi)容,移除惡意腳本,同時保留安全的HTML標簽和數(shù)學。以下是基礎使用指南,涵蓋基礎的安裝與用法。
1,安裝DOMPurify
通過npm或yarn安裝
npm install dompurify --save # 或 yarn add dompurify
或通過CDN引入
<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.0.5/purify.min.js"></script>
2,基礎用法
常常設置在表單的提交中,或者需要根據(jù)用戶改變html內(nèi)容的時候,凈化字符串,放置隱藏惡意腳本
import DOMPurify from 'dompurify' const success = await login(DOMPurify.sanitize(username.value), DOMPurify.sanitize(password.value)); // 在提交表單時 凈化表單內(nèi)容 放置惡意信息或腳本
效果舉例:
DOMPurify.sanitize('<img src=x onerror=alert(1)//>'); // 變成 <img src="x">
DOMPurify.sanitize('<svg><g/onload=alert(2)//<p>'); // 變成<svg><g></g></svg>
DOMPurify.sanitize('<p>abc<iframe//src=jAva	script:alert(3)>def</p>'); // 變成 <p>abc</p>
DOMPurify.sanitize('<math><mi//xlink:href="data:x,<script>alert(4)</script>" rel="external nofollow" >'); // 變成 <math><mi></mi></math>
DOMPurify.sanitize('<TABLE><tr><td>HELLO</tr></TABL>'); // 變成 <table><tbody><tr><td>HELLO</td></tr></tbody></table>
DOMPurify.sanitize('<UL><li><A HREF=//google.com>click</UL>'); // 變成 <ul><li><a rel="external nofollow" >click</a></li></ul>3,進階用法
配置config,允許或禁止特定的標簽或者屬性跳過凈化
const config = {
ALLOWED_TAGS: ['b', 'i', 'a', 'p'], // 只允許這些標簽
ALLOWED_ATTR: ['href', 'title'], // 只允許這些屬性
FORBID_TAGS: ['script', 'style'], // 禁止 script 和 style 標簽
FORBID_ATTR: ['onclick', 'onerror'] // 禁止事件屬性
};
const dirtyHTML = '<b onclick="alert(1)">點擊我</b>';
const cleanHTML = DOMPurify.sanitize(dirtyHtml, config);
// 輸出結(jié)果: <b>點擊我</b>自定義鉤子函數(shù)
在凈化過程中插入自定義邏輯:
DOMPurify.addHook('beforeSanitizeElements', (node) => {
// 移除所有圖片的 src 屬性
if (node.tagName === 'IMG') {
node.removeAttribute('src');
}
return node;
});
const dirtyHtml = '<img src="x" onerror="alert(1)">';
const cleanHtml = DOMPurify.sanitize(dirtyHtml); // 輸出結(jié)果: <img>4. 處理特殊場景
允許 SVG 內(nèi)容
默認情況下,DOMPurify 會移除 SVG 中的潛在危險內(nèi)容。若需允許 SVG:
const config = {
USE_PROFILES: { svg: true, svgFilters: true, html: true },
};
const dirtySvg = '<svg><script>alert(1)</script></svg>';
const cleanSvg = DOMPurify.sanitize(dirtySvg, config); // 移除 <script> 后的安全 SVG凈化 URL 屬性(如 href/src)
防止 javascript: 協(xié)議:
const config = {
ALLOWED_URI_REGEXP: /^(https?|ftp|mailto):/i, // 只允許 http/https/ftp/mailto
};
const dirtyLink = '<a href="javascript:alert(1)" rel="external nofollow" >點擊</a>';
const cleanLink = DOMPurify.sanitize(dirtyLink, config); // href 被移除處理富文本編輯器(如 CKEditor、Quill)
在提交富文本內(nèi)容前凈化:
// 假設 editor 是富文本編輯器實例
const rawContent = editor.getHtml();
const cleanContent = DOMPurify.sanitize(rawContent, {
ALLOWED_TAGS: ['p', 'b', 'i', 'u', 'a', 'img'],
ALLOWED_ATTR: ['href', 'title', 'src', 'alt'],
});5. 常見問題解答
Q1:DOMPurify 能防御所有 XSS 嗎?
不能。它主要防御 HTML 注入型 XSS,但無法處理:
URL 中的 JavaScript 協(xié)議(需配合正則校驗)。
CSS 表達式(如
expression(...))。非 HTML 上下文(如 JSON 注入)。
Q2:如何處理用戶上傳的 HTML 文件?
使用 DOMPurify 解析并凈化內(nèi)容,同時限制文件類型和大小。
Q3:DOMPurify 是否影響性能?
對于常規(guī)內(nèi)容(如評論、文章),性能影響可忽略。
處理大型 HTML(如 10MB 以上)時,建議在服務端異步處理。
6, 完整配置示例
const config = {
ALLOWED_TAGS: ['p', 'b', 'i', 'a', 'img', 'br'],
ALLOWED_ATTR: ['href', 'title', 'src', 'alt'],
FORBID_ATTR: ['style', 'class'],
ALLOWED_URI_REGEXP: /^(https?|ftp):/i,
FORBID_TAGS: ['script', 'iframe'],
RETURN_TRUSTED_TYPE: true, // 返回 TrustedHTML 對象(支持 Trusted Types)
};
const cleanHtml = DOMPurify.sanitize(dirtyHtml, config);7. 官方相關(guān)
官方文檔:DOMPurify GitHub
XSS 測試工具:OWASP XSS Filter Evasion Cheat Sheet
到此這篇關(guān)于前端安全之DOMPurify基礎安裝與用法的文章就介紹到這了,更多相關(guān)前端安全DOMPurify使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實現(xiàn)在網(wǎng)頁中彈出一個輸入框的方法
這篇文章主要介紹了JS實現(xiàn)在網(wǎng)頁中彈出一個輸入框的方法,實例分析了prompt的用法,可用來設置密碼,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
Web版彷 Visual Studio 2003 顏色選擇器
Web版彷 Visual Studio 2003 顏色選擇器...2007-01-01

