兩者皆為編碼方法,但**編碼規則、適用上下文、解碼方式**截然不同。混用會導致 XSS 漏洞、連結失效、資料顯示異常。本文透過實測對照表、原始碼分析、場景決策樹,釐清正確用法。
| 特性 | Server.HtmlEncode | Server.UrlEncode |
|---|---|---|
| 用途 | HTML 內容輸出 | URL 查詢字串/表單資料 |
| 編碼集合 | <→< >→> &→& "→" '→' 非 ASCII 字元→&#xxxx; | 空格→+ (或 %20) 非英數字元→%XX (UTF-8 位元組) +→%2B %→%25 |
| 解碼對應 | Server.HtmlDecode | Server.UrlDecode |
| 典型場景 | ` @HtmlEncode(userInput) `、`Label.Text = HtmlEncode(str)` | `Response.Redirect("?q=" + UrlEncode(keyword))`、`` |
| 輸出範例 (輸入 `中文 | `中文<tag>` | `%E4%B8%AD%E6%96%87%3Ctag%3E` |
string raw = "DK51700中繼站";
// HtmlEncode
string htmlEncoded = Server.HtmlEncode(raw);
// 頁面原始碼 form action: ...?Name=DK51700%u4e2d%u7ee7%u7ad9<%3bp>%3b
// 瀏覽器網址列: ...?Name=DK51700中繼站<p>
// HtmlDecode 後: DK51700中繼站 (瀏覽器自動解析實體,
不會顯示)
// UrlEncode
string urlEncoded = Server.UrlEncode(raw);
// 頁面原始碼 form action: ...?Name=DK51700%u4e2d%u7ee7%u7ad9
// 瀏覽器網址列: ...?Name=DK51700%D6%D0%BC%D5%BE (ANSI/UTF-8 視頁面編碼而定)
// 點擊連結: 若含 < > 會觸發 ASP.NET Request Validation 錯誤 ("潛在危險的 Request.QueryString")
` (瀏覽器自動解碼)。
資料要去哪裡?
├─ HTML 標籤內容 / 屬性值 / JavaScript 字串常值
│ └─ 用 HtmlEncode (或更佳:Razor @ 自動編碼、JS 用 JavaScriptStringEncode)
├─ URL 查詢字串參數值
│ └─ 用 UrlEncode
├─ URL 路徑段落
│ └─ 用 Uri.EscapeDataString (RFC 3986, 不將空格編為 +)
├─ HTTP Header 值
│ └─ 用 Header 專用編碼 (無標準方法,建議僅用 ASCII)
└─ 表單 POST body (application/x-www-form-urlencoded)
└─ 用 UrlEncode (HttpUtility.UrlEncode)
HtmlEncode 給 HTML 看,UrlEncode 給 HTTP 傳輸。切記上下文決定編碼器,永遠不要混用。現代框架 (Razor, Blazor, Angular, React) 多內建上下文感知編碼,優先使用框架機制,減少手動編碼錯誤。