承上篇,本文聚焦 Server.UrlEncode 行為,並揭示混合 HTML 標籤時的危險字元偵測機制。
+ (而非 %20,RFC 3986 標準為 %20,ASP.NET 歷史相容性保留 +)。%XX。! ' ( ) * ; : @ & = + $ , / ? # [ ]) 視情境編碼。| 輸入 | HtmlEncode 輸出 | UrlEncode 輸出 | 瀏覽器網址列顯示 |
|---|---|---|---|
DK51700中繼站 | DK51700%E4%B8%AD%E7%B9%BC%E7%AB%99 | DK51700%D6%D0%BC%C6%D5%BE (系統預設編碼頁) | DK51700中繼站 (自動解碼) |
DK51700中繼站<p> | DK51700%E4%B8%AD%E7%B9%BC%E7%AB%99<p> | 擲出例外:危險的 Request.QueryString | N/A |
當 UrlEncode 後的字串包含 <、> 等 HTML 標籤字元時,即使已編碼為 %3C/%3E,ASP.NET 預設要求驗證 (requestValidationMode="4.5") 仍會偵測到原始輸入含危險字元並拋出 HttpRequestValidationException。
HtmlEncode 再 UrlEncode → < → < → %26lt%3B,繞過驗證但解碼需對應雙重解碼。Convert.ToBase64String(Encoding.UTF8.GetBytes(input)) → 傳遞純英數字元,完全避開驗證。<pages validateRequest="false" /> 或 [ValidateInput(false)],引入 XSS 風險。| 場景 | 建議編碼方式 |
|---|---|
| QueryString 傳遞純文字/ID | UrlEncode |
| QueryString 可能含 HTML/特殊字元 | Base64 或 POST Body |
| HTML 內容輸出 (防 XSS) | HtmlEncode / Razor 自動編碼 @Model.Content |
| JavaScript 字串常值 | JavaScriptStringEncode (ASP.NET 4.5+) |
| CSS/URL/屬性值 | 對應專用編碼器 (AntiXSS Library) |
理解各編碼器的編碼集合與 ASP.NET 要求驗證機制,能避免「明明編碼了卻仍被攔截」的困擾。