在 2000 年的時候,當時很流行在討論區交朋友。我也常常上去和台灣或香港的網友傾談。有一天如常進入討論區,突然就有很多咒罵的 message box 彈出來。當時我完全不明白是什麼情況,後來討論區管理員應該是找到那則留言並刪除了。現在學過 XSS,我才知道原來是有人在留言中放了:
<script>alert('咒罵字句');</script>這就是典型的 XSS 攻擊。
⚙️ XSS 的原理
- 注入惡意程式碼:攻擊者將 JavaScript 或其他腳本語言插入網站的輸出內容。
- 瀏覽器執行:使用者載入頁面時,瀏覽器會誤以為這段程式碼來自可信任網站並執行。
- 結果:攻擊者可竊取敏感資訊(如 Cookie、Session)、冒充使用者操作,甚至修改頁面內容。
🛠️ 常見 XSS 類型
- 反射型(Reflected XSS):惡意程式碼透過 URL 或表單提交立即回應並執行。
- 儲存型(Stored XSS):惡意程式碼被永久儲存在伺服器(如留言板、討論區),所有訪問者都會受影響。
- DOM 型(DOM-based XSS):利用瀏覽器端的 JavaScript 操作 DOM,直接在用戶端觸發攻擊。
📖 案例故事:Twitch 聊天室被惡搞
在 Twitch 直播平台,部分留言區未妥善過濾使用者輸入,攻擊者在留言中插入惡意 JavaScript。結果所有觀看直播的用戶瀏覽器都執行了這段程式碼,聊天室畫面被竄改,造成大規模混亂。這是一個典型的 儲存型 XSS 案例。
🎭 比喻:咖啡店的點餐單
想像一家咖啡店:
- 正常情況下,顧客在點餐單上寫下「拿鐵」或「美式」,店員就會照單提供。
- 但如果有人在單子上寫下「把所有咖啡機關掉」,店員可能真的照做。
- XSS 就像這樣,攻擊者把「假指令」放進網站,瀏覽器卻當成真訊息來執行。
☕ XSS 範例
<!-- 正常情況下,顧客輸入「Latte」 -->
<input type="text" value="Latte">
<!-- 惡意顧客輸入 -->
<input type="text" value="<script>alert('關掉所有咖啡機!');</script>">👉 如果網站沒有過濾輸入,瀏覽器就會執行這段程式碼,就像店員真的去關掉所有咖啡機一樣。
🔒 防範方法與程式碼範例
C# 範例:輸入消毒
public string SanitizeInput(string userInput)
{
// 將特殊字元轉換為 HTML 編碼,避免直接執行
return System.Net.WebUtility.HtmlEncode(userInput);
}👉 這樣能確保使用者輸入的 <script> 永遠不會被瀏覽器當成程式碼執行。
JavaScript 範例:避免直接拼接 HTML
// 錯誤做法:直接插入使用者輸入
document.getElementById("output").innerHTML = userInput;
// 正確做法:使用 textContent
document.getElementById("output").textContent = userInput;👉 使用 textContent 能確保使用者輸入永遠被當成文字,而不是程式碼。
📌 給讀者的提醒
- 開發者:永遠不要相信使用者輸入,必須消毒與驗證。
- 企業:任何開放評論或輸入的功能,都要特別注意 XSS 防護。
- 一般用戶:避免在可疑網站輸入敏感資訊,並保持瀏覽器更新。
✅ 結語
XSS 是最常見的網頁攻擊之一,雖然它不直接破壞伺服器,但能竊取使用者資料、冒充操作,甚至大規模影響平台。對企業與開發者而言,輸入消毒、CSP、防火牆與安全測試是防範的核心;對使用者而言,保持警覺與良好安全習慣同樣重要。