
如何防止跨網站指令碼(XSS)攻擊?
了解如何防止 XSS 攻擊、找出弱點,並消除潛伏威脅。我們的指南涵蓋防止跨網站指令碼攻擊的基本原則。

在最近的跨網站指令碼(XSS)弱點事件之後,FBI 和 CISA 近期加強了其安全措施,並專注於提升網路韌性。不令人意外的是,組織往往未能處理最基本的問題,而這正是資料外洩發生的原因。
當 Web 應用程式與服務無法妥善處理請求、輸入內容,或未如預期運作時,就會發生跨網站指令碼攻擊。這類攻擊之所以危險,是因為它們不僅針對應用程式,也會針對其背後的使用者。
以下是關於跨網站指令碼攻擊的指南,以及您應該了解的所有相關內容。
什麼是跨網站指令碼(XSS)攻擊?
沒有任何應用程式或網站是完美的;其中都存在隱藏缺陷。 跨網站指令碼 攻擊會利用這一點,傳送惡意程式碼使其發生異常。這些攻擊可讓惡意行為者接管受害者的身分,甚至冒充受害者。
惡意指令碼潛伏在 Web 應用程式中,因此不易被偵測。它會混入應用程式的原始碼中,使服務無法驗證其是否來自不受信任的來源。那麼,結果會是什麼?
駭客可存取 Cookie、網站權杖,以及您的網頁瀏覽器所蒐集的其他敏感資料。如果您的網站或應用程式將內容傳送到不同位置,這些內容也會自動遭到攔截。可在貼文下方留言的線上論壇與使用者留言板也同樣容易受到影響。
跨網站指令碼(XSS)攻擊的類型
XSS 弱點過去曾造成蠕蟲,並削弱應用程式安全措施。它們可能散布惡意軟體、釣取憑證,並劫持防禦網站。
跨網站指令碼(XSS)攻擊主要有三種類型。在了解如何防止 XSS 攻擊之前,先認識您所面臨的威脅。如下所示。
1. 儲存型 XSS(Persistent XSS)
這是最基本但也最危險的 XSS 形式之一。儲存型 XSS 是指在缺乏輸入驗證時,惡意程式碼被儲存在 Web 資料庫中。攻擊者透過 Web 應用程式弱點注入程式碼,並將其永久儲存。受害者可能在不知情的情況下執行該指令碼,而承載內容會以 HTML 程式碼形式傳送到其網頁瀏覽器。一旦他們在載入網頁時執行惡意指令碼,一切就結束了。
一個經典範例是部落格文章中的留言。攻擊者可以附加一個 URL,並誘使受害者點擊後閱讀該留言。當使用者互動時,程式碼就會自動被執行。
2. 反射型 XSS(Non-Persistent XSS)
當攻擊者的承載內容成為傳送至網頁瀏覽器內容的一部分時,就會演變成反射型 XSS 攻擊。該請求會從瀏覽器反彈回來,因此 HTTP 回應會包含來自 HTTP 請求的承載內容。駭客可以結合 社交工程 威脅、惡意連結,以及其他 網路釣魚詐騙 手法,誘使受害者發出伺服器請求。這種技術唯一的限制是,攻擊者需要分別向每位受害者傳送個別承載內容。 他們無法大規模傳送承載內容;大多數反射型 XSS 攻擊都是在社群媒體網路上進行的。
3. 基於 DOM 的 XSS
基於 DOM 的 XSS 涉及透過從攻擊者可控制的來源取得惡意 Javascript 程式碼來入侵使用者帳戶。它會將此程式碼傳遞到會動態執行它的 sink,並任意執行該程式碼區塊。瀏覽器 URL 是這些跨網站指令碼攻擊最常見的來源。攻擊者也會加入連結,將受害者導向在查詢字串中嵌入酬載的易受攻擊頁面。他們也可能會將 URL 的部分內容片段化,並透過誤導進一步操控受害者。
跨網站指令碼(XSS)如何運作?
跨網站指令碼會透過竄改有弱點的網站,並向使用者回傳惡意 JavaScript 程式碼來運作。當攻擊者注入惡意程式碼,並從受害者的瀏覽器內部執行時,他們就能完全危害其應用程式,以及隨之發生的任何互動。
跨來源 iframe 不允許使用者呼叫 alert 函式。它們被用來構成某些較進階的 XSS 攻擊。攻擊者也可以取得 Web 應用程式內的權限與使用者存取控制,並奪取其中儲存的資料。
跨網站指令碼攻擊與弱點可能讓攻擊者冒充受害者,並在整個網路中假扮成對方。他們可以繞過來源政策。他們可以將不同網站完全隔離開來。
現在,以下是跨網站指令碼攻擊如何運作的簡化概述:
- 攻擊者會傳送惡意連結給您。當您點擊後,程式碼就會被注入,而動態內容將傳送到網頁瀏覽器。
- 它會向攻擊者的 Web 伺服器傳送 HTTP 請求。接著,劫持者便可利用您遭竊的 Cookie 來冒充您。
- 他們可以存取敏感資訊,並發動更進階的社交工程攻擊。
- 跨網站指令碼攻擊可讓攻擊者繞過旨在將不同網站彼此隔離的同源政策。這些攻擊執行起來極具破壞性,並可能損害您企業的聲譽。對手可以透過變更內容來破壞您的組織,並損害或玷污公司的形象。
- 他們可以散布錯誤資訊、變更您網站上的使用者指示,並誤導使用者。
XSS 攻擊具有高度危險性,尤其是在其目標為政府機關、醫療保健組織,或是在危機期間提供關鍵資源的公司時。
如何防止跨網站指令碼(XSS)攻擊?
您可以採取不同的方法。了解這些方法,以知道如何防止跨網站指令碼攻擊:
- 驗證 Web 應用程式與服務的輸入內容有助於防止跨網站指令碼攻擊(XSS)。您也可以使用弱點掃描器檢查您的網站是否存在其他安全弱點。這是了解如何自動防止(XSS)攻擊的最佳方式之一。
- 防止 XSS 攻擊的第二種方式,是在輸出時對資料進行編碼。理想情況下,這應在您將資料寫入頁面之前完成。您需要使用的編碼類型將取決於您的寫入情境。
- 例如,JavaScript 字串值所需的編碼類型會不同於 HTML 情境中的編碼。在 HTML 情境中,您必須將未列入白名單的值轉換為 HTML 實體。但在 JavaScript 字串情境中,您必須確保對非英數值進行 Unicode 跳脫。
- 可能需要多層編碼,而且此程序必須依正確順序套用。您必須將使用者輸入嵌入事件處理常式中,並處理 HTML 與 JavaScript 情境。對輸入內容在到達時進行驗證的方法有很多。
- 例如,如果使用者提交一個 URL,並在回應中返回該 URL,您可以透過要求其以 HTTPS 和 HTTP 等安全通訊協定開頭來驗證。當使用者以字母或數字提供值時,您也可以驗證這些值。您也可以透過將輸入限制為預期的一組字元,採取不同的驗證方式。
以下是您也可以採取的其他一些方法:
- 您可以列出網站上允許的所有安全通訊協定。因此,您的防禦機制將預設自動封鎖其無法識別的有害通訊協定。這可使 XSS 攻擊無法透過試圖規避封鎖清單來混淆無效值。
- 不應允許使用者張貼 HTML 標記,但有時這是必要的。您可以透過實作白名單來過濾有害標籤。它們會保留安全標籤,並過濾掉與黑名單標籤相關的任何惡意程式碼。除非您明確指定,否則任何不在白名單中的標籤都將被視為黑名單。
- 您需要監控網站的安全更新。假設您打算使用 JavaScript 程式庫,直接從使用者的瀏覽器執行過濾與編碼。在這種情況下,您也可以使用伺服器端範本引擎來防止 XSS 攻擊。它可以將動態內容嵌入 HTML 中,並定義特定程式碼。
- 您也可以使用帶有引數的篩選器並定義情境。這有助於防止大多數 XSS 攻擊情況。您也可以檢視這些跳脫功能,定期評估是否要繼續使用範本引擎或框架。
- PHP 中也有用於編碼實體的內建函式,當您的值位於 HTML 情境中時,您可以呼叫它們來跳脫輸入內容。您可以使用三個引數呼叫它們,並且需要 Unicode 跳脫輸入。PHP 不提供任何用於 Unicode 字串跳脫的 API。
- 將您的字串轉換為 HTML 實體,然後再呼叫函式。您可以使用自訂的 HTML 編碼器來防止用戶端 JavaScript XSS 攻擊。

Enhance Your Threat Intelligence
See how the SentinelOne threat-hunting service WatchTower can surface greater insights and help you outpace attacks.
跨網站指令碼(XSS)攻擊:預防提示(涵蓋最佳實務)
您可以建立以防止 XSS 攻擊的最佳實務包括:
- 透過編碼清理使用者輸入與輸出資料。
- 您可以將特殊字元替換為編碼值,讓所有資料都能以文字而非程式碼的形式處理。如果攻擊者面對的是純文字,就無法注入惡意指令碼。若您正確套用編碼,就不會有任何使用者因此受到影響。
- 您可以根據業務邏輯或應用程式類型套用多種類型的編碼,甚至包括所儲存與處理的資料類型。編碼方法有很多種,例如對 HTML 實體進行編碼,這是最基本的措施之一。您也可以對屬性值進行編碼。
- 另一項防止 XSS 攻擊的良好做法,是在用戶端過濾接收到的資料。資料過濾會移除危險字元,例如標籤、HTML 事件處理常式、惡意 JavaScript 元素等。
- 您可以結合輸入與輸出過濾來回傳網頁回應。此方法最能緩解儲存型 XSS 攻擊。
- 驗證使用者輸入是另一項安全措施。例如,如果您將預設輸入欄位設定為允許文字資料類型,使用者就不可能輸入數字。這對網頁表單很有效;可驗證輸入內容,以防止攻擊者透過授權上傳惡意指令碼。網頁瀏覽器只允許存取被允許的資源,並忽略其他所有網域。即使攻擊者成功發現 XSS 注入弱點,注入的指令碼也不會被執行。
- 若要在 jQuery 中防止跨網站指令碼攻擊,您可以將使用者輸入傳遞給 jQuery 選擇器。最常見的做法是使用 location。Hash 並將選擇器傳遞以呈現 HTML。jQuery 可以識別此問題,並修補選擇器邏輯,以檢查輸入是否以雜湊值開頭。
- 您可以指定可從網站來源載入的資源,例如影像和指令碼。如果攻擊者注入 XSS 酬載,他們將無法載入超出目前來源的資源。jQuery 選擇器可大幅降低 XSS 攻擊或弱點發生的機率。
如果您打算將不受信任的資料傳遞給 jQuery 選擇器,請確保使用 js—escape 函式正確逸出值。您也可以利用內容安全政策來緩解 XSS 攻擊。這些政策可協助您控制外部指令碼管理的各個面向,例如載入它們以及執行內嵌指令碼。
常見的 XSS 攻擊範例
以下是一些真實世界中常見的 XSS 攻擊範例:
- British Airways 在 2018 年遭到知名駭客組織 MageCart 入侵。該組織利用 JavaScript 程式庫中的 XSS 弱點。客戶資料被傳送到一個網域名稱與官方網站相似的惡意伺服器。最終,他們從超過 380,000 筆訂票交易中竊取信用卡資料,直到資料外洩過晚才被發現,讓這家航空公司蒙受巨大損失。
- Fornite 是一款熱門的線上多人遊戲,曾遭遇 XSS 攻擊。一個不安全的 SSO 弱點將使用者重新導向至假的登入頁面,導致其詳細資料遭竊。玩家也失去了遊戲內的虛擬貨幣,且記錄的玩家聊天內容遭到外洩。
- eBay 曾存在一個 XSS 弱點,讓攻擊者能完全存取賣家帳戶。劫持者操控 eBay 刊登項目的排序位置,甚至在 eBay 發現並修補該弱點後仍持續發動攻擊。
結論
跨網站指令碼攻擊是最嚴重的 Web 安全威脅之一,會削弱對線上平台的信心並危及使用者資料。透過了解 XSS 攻擊類型並套用適當的防護機制,開發人員可以保護其應用程式。適當措施包括輸入驗證、輸出編碼,以及套用內容安全政策。
安全稽核 以及先進的威脅偵測工具,對於確保安全可靠的線上存在至關重要。隨著技術進步,攻擊者的方法也會演變,因此保持警覺至關重要。透過優先防範 XSS,組織可以保護其聲譽,並確保其線上存在的完整性。
常見問題
XSS 攻擊涉及將惡意指令碼注入網站,讓駭客得以存取敏感的使用者資料。XSS 攻擊會利用 Web 應用程式弱點,且通常使用使用者輸入或遭操控的 URL。
開發人員可透過檢查使用者輸入、對輸出資料進行編碼,以及僅允許惡意指令碼,來避免 XSS 攻擊。定期安全稽核與內容安全政策也能降低風險。
XSS 攻擊會注入在使用者存取的瀏覽器上執行的惡意指令碼,藉此利用 Web 應用程式、繞過安全控制並存取敏感資訊。
必須避免 XSS,因為它可能導致資料外洩、財務損失與聲譽受損。它也會破壞使用者信任,並可能傳遞惡意軟體或發動網路釣魚攻擊。
解決方案與工具包括弱點掃描器、Web 應用程式防火牆,以及進階威脅偵測系統。這些工具可協助偵測弱點並阻止惡意指令碼執行。
可以。WAF 可透過過濾流量並在惡意指令碼與應用程式互動前識別它們,來阻擋 XSS 攻擊。
XSS 測試會使用弱點掃描器與滲透測試工具來模擬攻擊,並找出惡意指令碼可能的進入點。
為了防範不斷演變的威脅,應定期執行 XSS 弱點安全掃描,理想情況下每三個月一次。



