首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

ASP.NET Server.HtmlEncode 與 Server.UrlEncode 差異解析與正確使用場景

     編輯:關於C#

兩者皆為編碼方法,但**編碼規則、適用上下文、解碼方式**截然不同。混用會導致 XSS 漏洞、連結失效、資料顯示異常。本文透過實測對照表、原始碼分析、場景決策樹,釐清正確用法。

核心差異速查

特性Server.HtmlEncodeServer.UrlEncode
用途HTML 內容輸出URL 查詢字串/表單資料
編碼集合<→&lt; >→&gt; &→&amp; "→&quot; '→&#39; 非 ASCII 字元→&#xxxx;空格→+ (或 %20) 非英數字元→%XX (UTF-8 位元組) +→%2B %→%25
解碼對應Server.HtmlDecodeServer.UrlDecode
典型場景`
@HtmlEncode(userInput)
`、`Label.Text = HtmlEncode(str)`
`Response.Redirect("?q=" + UrlEncode(keyword))`、``
輸出範例 (輸入 `中文`)`中文&lt;tag&gt;``%E4%B8%AD%E6%96%87%3Ctag%3E`

實測驗證 (ASP.NET WebForm)

string raw = "DK51700中繼站

"; // HtmlEncode string htmlEncoded = Server.HtmlEncode(raw); // 頁面原始碼 form action: ...?Name=DK51700%u4e2d%u7ee7%u7ad9&lt%3bp&gt%3b // 瀏覽器網址列: ...?Name=DK51700中繼站&lt;p&gt; // 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")

關鍵觀察

  1. HtmlEncode 輸出含 HTML 實體,瀏覽器網址列會顯示 `&lt;p&gt;`,但實際導向時伺服器收到的是原始字元 `

    ` (瀏覽器自動解碼)。

  2. UrlEncode 輸出為 %XX 形式,適合 HTTP 傳輸,但 `<` `>` 等字元會被 ASP.NET Request Validation 攔截 (預設開啟),需在頁面指令 `<%@ Page ValidateRequest="false" %>` 或 `` 關閉 (不建議)。
  3. 雙重編碼風險:`UrlEncode(HtmlEncode(str))` 或反向,會導致解碼失敗。

決策樹:我該用哪個?

資料要去哪裡?
├─ 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)

現代 ASP.NET Core / Razor Pages 最佳實踐

結語

HtmlEncode 給 HTML 看,UrlEncode 給 HTTP 傳輸。切記上下文決定編碼器,永遠不要混用。現代框架 (Razor, Blazor, Angular, React) 多內建上下文感知編碼,優先使用框架機制,減少手動編碼錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved