XSS 是指在表單裡輸入的文字,在另一個人的畫面上作為指令碼執行。本文從零講解其原理與可靠的防範方法(不會寫出攻擊步驟)。
三種類型
XSS 按「惡意字串經由何處被執行」分為三種。
| 類型 | 如何被植入 |
|---|---|
| 儲存型(Stored) | 被保存在貼文、個人資料等處,在所有瀏覽者的瀏覽器中執行(最危險) |
| 反射型(Reflected) | URL 參數等被原樣反射到頁面上,在點擊了連結的人那裡執行 |
| DOM 型(DOM-based) | 不經由伺服器,由瀏覽器端的 JS 危險地處理輸入而引發 |
為什麼危險(原理)
瀏覽器會把頁面中寫的 <script> 當作「正規程式碼」執行。當攻擊者的字串原樣作為 HTML 混入頁面時,瀏覽器無法把它和真正的程式碼區分開。
危害是「在那個頁面上能做的一切」。如果說 RCE 是伺服器端最嚴重的漏洞,那麼 XSS 就相當於用戶端(使用者)最嚴重的漏洞。
防禦:輸出時跳脫
XSS 的基本原則是用「輸出」而非「輸入」來防。在把值顯示到畫面上的那一刻,將其轉換為不會被當作 HTML 解析的形式。
輸出時跳脫(最重要)
把來自使用者的值顯示到畫面上時,將 < > & " ' 等轉換為 HTML 實體。要按輸出所處的位置(HTML 正文·屬性·JS·URL)採用各自正確的方式。
不要破壞框架的自動跳脫
React/Vue/各類範本預設會自動跳脫。只要避免 dangerouslySetInnerHTML 或 v-html 這類「直接插入生 HTML」的做法,就能防住大部分情況。
用 CSP(Content-Security-Policy)做多層防禦
萬一有遺漏,也能在瀏覽器端阻止未經許可的指令碼執行。透過限制行內指令碼等手段把危害降到最低。
保護 Cookie
給工作階段 Cookie 加上 HttpOnly,讓 JS 無法讀取。即使 XSS 漏過了防線,也能減少損害。
本站的觀點:最大的防禦是別自己停用安全功能
現代框架預設就傾向於安全一側。許多 XSS 正是在開發者 「想直接放入 HTML」而刻意關掉自動跳脫的那一刻產生的。如果確實要允許 HTML,就不要用自己寫的字串處理,而要使用經過驗證的 sanitize 工具。「為了方便而放棄安全」才是最大的風險。
XSS 與容易混淆的攻擊有何不同
XSS 常與名稱相近的 CSRF,以及同樣是「輸入被當成指令」的 SQL 注入搞混。差別在於「什麼東西在哪裡執行」。
| 攻擊 | 在哪裡發生什麼 | 主要防禦 |
|---|---|---|
| XSS | 攻擊者的指令碼作為真實頁面的一部分,在使用者的瀏覽器中執行 | 輸出時跳脫、CSP |
| CSRF | 利用使用者已登入的工作階段,送出使用者無意送出的請求。不需要執行指令碼 | CSRF 權杖、SameSite Cookie |
| SQL 注入 | 輸入在伺服器端被解讀為 SQL 敘述的一部分 | 預留位置(placeholder) |
| 點擊劫持 | 把真實頁面透明地疊在上面,讓使用者在不知情下點擊 | CSP frame-ancestors |
要注意,XSS 也能突破 CSRF 防禦。一旦指令碼在頁面內執行,它也能讀到該頁面上的 CSRF 權杖(OWASP 的 CSRF 指南也有同樣的警告)。
實際案例:在員工開啟的畫面上發生的 XSS
2026 年,學習管理系統 Canvas 的營運公司 Instructure 表示,一起入侵事件是從 XSS 開始的。依該公司說明,攻擊者用免費帳號提交了含有惡意程式碼的客服工單,客服人員開啟時,XSS 漏洞被利用而取得了 Canvas 內部的較高權限(→ Canvas(Instructure)資料外洩,英文)。
教訓是:XSS 不只是公開頁面的問題。客服、聯絡表單與管理畫面會把外部送來的文字顯示給自家員工看,而開啟它們的帳號權限更大,所以風險更高。
XSS 至今仍是最常見的弱點之一。在 MITRE 於 2025 年 12 月公布的「CWE Top 25」(最危險的 25 種軟體弱點)中,XSS(CWE-79)排名第一。2024 年 9 月,美國 CISA 與 FBI 也發出警示,要求軟體廠商從產品中消除 XSS。
如何檢查自己的網站
不需要嘗試攻擊字串。先從這四項檢查開始。
找出直接插入生 HTML 的地方
在程式碼中搜尋 dangerouslySetInnerHTML、v-html、innerHTML 與 document.write,確認來自使用者的值是否可能傳到這些地方。如果可能,就改成以文字顯示,或交給經過驗證的 sanitize 工具處理。
確認工作階段 Cookie 的屬性
在瀏覽器的開發人員工具(Application → Cookies)確認工作階段 Cookie 有 HttpOnly 與 Secure。網站健檢也會檢查 Cookie 屬性。
把管理與客服畫面也納入
確認顯示外部文字(工單內文、檔名、顯示名稱)的內部畫面,與公開頁面採用同樣標準的跳脫。
出處(一手資料)
- OWASP, "Cross Site Scripting Prevention Cheat Sheet" — cheatsheetseries.owasp.org(依輸出上下文跳脫、框架的安全預設)
- MITRE, "2025 CWE Top 25 Most Dangerous Software Weaknesses"(2025 年 12 月)— cwe.mitre.org(CWE-79 排名第一)
- CISA 與 FBI, "Secure by Design Alert: Eliminating Cross-Site Scripting Vulnerabilities"(2024 年 9 月 17 日)— cisa.gov
- OWASP, "Cross-Site Request Forgery Prevention Cheat Sheet" — cheatsheetseries.owasp.org(XSS 可繞過 CSRF 防禦)
- IPA「安全なウェブサイトの作り方」(日文)— ipa.go.jp
接下來閱讀
- 術語:CSRF 是什麼 / RCE 是什麼 / JWT 是什麼(XSS 中容易被竊取的權杖)
- 入門:安全超入門
- 縱深防禦:安全標頭不是越多越好(CSP 可以縮小 XSS 能做的事)