在 2000 年的時候,當時很流行在討論區交朋友。我也常常上去和台灣或香港的網友傾談。有一天如常進入討論區,突然就有很多咒罵的 message box 彈出來。當時我完全不明白是什麼情況,後來討論區管理員應該是找到那則留言並刪除了。現在學過 XSS,我才知道原來是有人在留言中放了:

<script>alert('咒罵字句');</script>

這就是典型的 XSS 攻擊

⚙️ XSS 的原理

  • 注入惡意程式碼:攻擊者將 JavaScript 或其他腳本語言插入網站的輸出內容。
  • 瀏覽器執行:使用者載入頁面時,瀏覽器會誤以為這段程式碼來自可信任網站並執行。
  • 結果:攻擊者可竊取敏感資訊(如 Cookie、Session)、冒充使用者操作,甚至修改頁面內容。

🛠️ 常見 XSS 類型

  1. 反射型(Reflected XSS):惡意程式碼透過 URL 或表單提交立即回應並執行。
  2. 儲存型(Stored XSS):惡意程式碼被永久儲存在伺服器(如留言板、討論區),所有訪問者都會受影響。
  3. 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、防火牆與安全測試是防範的核心;對使用者而言,保持警覺與良好安全習慣同樣重要。