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

ASP.NET Server.HtmlEncode 與 UrlEncode 差異深度解析 (二)

     編輯:關於C語言

承上篇,本文聚焦 Server.UrlEncode 行為,並揭示混合 HTML 標籤時的危險字元偵測機制。

UrlEncode 規則

  • 空格 → + (而非 %20,RFC 3986 標準為 %20,ASP.NET 歷史相容性保留 +)。
  • 非 ASCII 字元 (中文等) → UTF-8 位元組序列,每位元組 %XX。
  • 保留字元 (! ' ( ) * ; : @ & = + $ , / ? # [ ]) 視情境編碼。

實測對照表

輸入HtmlEncode 輸出UrlEncode 輸出瀏覽器網址列顯示
DK51700中繼站DK51700%E4%B8%AD%E7%B9%BC%E7%AB%99DK51700%D6%D0%BC%C6%D5%BE (系統預設編碼頁)DK51700中繼站 (自動解碼)
DK51700中繼站<p>DK51700%E4%B8%AD%E7%B9%BC%E7%AB%99&lt;p&gt;擲出例外:危險的 Request.QueryStringN/A

關鍵發現:ASP.NET 要求驗證攔截

當 UrlEncode 後的字串包含 <、> 等 HTML 標籤字元時,即使已編碼為 %3C/%3E,ASP.NET 預設要求驗證 (requestValidationMode="4.5") 仍會偵測到原始輸入含危險字元並拋出 HttpRequestValidationException。

解決方案

  1. 雙重編碼:先 HtmlEncode 再 UrlEncode → < → &lt; → %26lt%3B,繞過驗證但解碼需對應雙重解碼。
  2. Base64 編碼:Convert.ToBase64String(Encoding.UTF8.GetBytes(input)) → 傳遞純英數字元,完全避開驗證。
  3. 關閉驗證 (不建議):<pages validateRequest="false" /> 或 [ValidateInput(false)],引入 XSS 風險。
  4. 使用 POST + Body:將複雜資料放入 Request Body (JSON/Form),而非 QueryString。

最佳實務建議

場景建議編碼方式
QueryString 傳遞純文字/IDUrlEncode
QueryString 可能含 HTML/特殊字元Base64 或 POST Body
HTML 內容輸出 (防 XSS)HtmlEncode / Razor 自動編碼 @Model.Content
JavaScript 字串常值JavaScriptStringEncode (ASP.NET 4.5+)
CSS/URL/屬性值對應專用編碼器 (AntiXSS Library)

理解各編碼器的編碼集合與 ASP.NET 要求驗證機制,能避免「明明編碼了卻仍被攔截」的困擾。

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