名詞解釋

XSS(跨站指令碼)是什麼:讓攻擊者的指令碼在其他使用者瀏覽器中執行的漏洞

XSS(跨站指令碼)是讓攻擊者植入的指令碼在其他使用者瀏覽器中執行的漏洞,會導致工作階段被竊取。說明儲存型、反射型、DOM 型三種類型,以及輸出跳脫、框架自動跳脫與 CSP 等防禦。

發布於 2026-06-08 更新於 2026-10-06 閱讀時間 3 分鐘
本頁內容

XSS 是指在表單裡輸入的文字,在另一個人的畫面上作為指令碼執行。本文從零講解其原理與可靠的防範方法(不會寫出攻擊步驟)。

三種類型

XSS 按「惡意字串經由何處被執行」分為三種。

類型如何被植入
儲存型(Stored)被保存在貼文、個人資料等處,在所有瀏覽者的瀏覽器中執行(最危險)
反射型(Reflected)URL 參數等被原樣反射到頁面上,在點擊了連結的人那裡執行
DOM 型(DOM-based)不經由伺服器,由瀏覽器端的 JS 危險地處理輸入而引發

為什麼危險(原理)

瀏覽器會把頁面中寫的 <script> 當作「正規程式碼」執行。當攻擊者的字串原樣作為 HTML 混入頁面時,瀏覽器無法把它和真正的程式碼區分開。

① 攻擊者發布「字串」(留言·名字·URL 等)
↓ 伺服器未跳脫就輸出
② 該字串作為 HTML 的一部分混入頁面
↓ 受害者開啟頁面
③ 程式碼在受害者的瀏覽器中執行=工作階段被竊取·冒充
把來自使用者的字串「原樣」輸出時,瀏覽器會把它當作程式碼執行。

危害是「在那個頁面上能做的一切」。如果說 RCE 是伺服器端最嚴重的漏洞,那麼 XSS 就相當於用戶端(使用者)最嚴重的漏洞。

防禦:輸出時跳脫

XSS 的基本原則是用「輸出」而非「輸入」來防。在把值顯示到畫面上的那一刻,將其轉換為不會被當作 HTML 解析的形式。

1

輸出時跳脫(最重要)

把來自使用者的值顯示到畫面上時,將 < > & " ' 等轉換為 HTML 實體。要按輸出所處的位置(HTML 正文·屬性·JS·URL)採用各自正確的方式。

2

不要破壞框架的自動跳脫

React/Vue/各類範本預設會自動跳脫。只要避免 dangerouslySetInnerHTML 或 v-html 這類「直接插入生 HTML」的做法,就能防住大部分情況。

3

用 CSP(Content-Security-Policy)做多層防禦

萬一有遺漏,也能在瀏覽器端阻止未經許可的指令碼執行。透過限制行內指令碼等手段把危害降到最低。

4

保護 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。

如何檢查自己的網站

不需要嘗試攻擊字串。先從這四項檢查開始。

1

找出直接插入生 HTML 的地方

在程式碼中搜尋 dangerouslySetInnerHTML、v-html、innerHTML 與 document.write,確認來自使用者的值是否可能傳到這些地方。如果可能,就改成以文字顯示,或交給經過驗證的 sanitize 工具處理。

2

確認是否送出 CSP

用安全標頭檢查確認 Content-Security-Policy 是否存在、允許了哪些內容。允許 'unsafe-inline' 會大幅削弱對 XSS 的防護。要新寫一份時,可用 CSP 產生器起草,先以 Report-Only 模式(只回報違規)執行。

3

確認工作階段 Cookie 的屬性

在瀏覽器的開發人員工具(Application → Cookies)確認工作階段 Cookie 有 HttpOnly 與 Secure。網站健檢也會檢查 Cookie 屬性。

4

把管理與客服畫面也納入

確認顯示外部文字(工單內文、檔名、顯示名稱)的內部畫面,與公開頁面採用同樣標準的跳脫。

出處(一手資料)

  • 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

接下來閱讀

分類編號

CWE 對造成漏洞的弱點類型進行分類,MITRE ATT&CK 對攻擊者的技術進行分類。兩者皆由 MITRE 維護,廣泛用於標註漏洞資訊與偵測規則。

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

QXSS 會造成什麼後果?
A

攻擊者植入的指令碼會作為真實頁面的一部分在受害者的瀏覽器中執行。結果可能導致工作階段被竊取(冒充登入)、輸入被偷看、頁面被竄改、自動執行其他操作等。

QXSS 最主要的防禦是什麼?
A

是「輸出時跳脫」。把來自使用者的值顯示到頁面上時,將其轉換為不會被當作 HTML 解析的形式。React/Vue 等範本預設就會這樣做,所以不要自己破壞這套自動跳脫(避免使用 dangerouslySetInnerHTML 等)就是最有效的對策。此外再用 CSP 做多層防禦。

Q在輸入時做 sanitize 就夠了嗎?
A

往往不夠。可靠的防禦是「按輸出所處的上下文(HTML 正文·屬性·JS·URL)分別正確地 escape」。只靠輸入過濾,會因為搞錯上下文而出現遺漏。只有在確實要允許 HTML 時,才使用可信賴的 sanitize 工具。

Q為什麼叫 XSS 而不是 CSS?
A

Cross-Site Scripting 的首字母是 CSS,但這會與用來設定網頁樣式的語言 CSS(Cascading Style Sheets)撞名。所以把「Cross」寫成 X,XSS 就成了標準縮寫。

Q導入 CSP 之後,還需要其他 XSS 防禦嗎?
A

需要。CSP(Content-Security-Policy)是跳脫有疏漏時用來限制損害的第二層。允許 'unsafe-inline' 的 CSP,對 XSS 的效果會大打折扣。輸出時跳脫仍是基礎,CSP 是疊在它上面的一層。

QCookie 設了 HttpOnly,就不用擔心 XSS 了嗎?
A

能減輕損害,但不能消除。HttpOnly 只是讓指令碼讀不到 Cookie。透過 XSS 執行的指令碼,仍然可以從頁面內以使用者身分送出請求,並讀取頁面上顯示的任何內容。HttpOnly 是限制損害,不是防止 XSS。