首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

ASP.NET QueryString 傳值:%2B (+號) 被自動解碼為空格的編碼陷阱與解決方案

     編輯:程式設計疑難解答

現象

客戶端傳 `%2B` (URL 編碼的 `+`),服務端 `Request.QueryString["key"]` 取得 `+`,但進一步 `UrlDecode` 變成空格,導致數據錯誤。

根因

ASP.NET **自動對 QueryString 進行一次 UrlDecode**,流程:

  1. 瀏覽器發送:`key=%2B` (即 `+` 的編碼)。
  2. ASP.NET 內部解析 QueryString → 自動 Decode → 內部存儲為 `+`。
  3. 代碼調用 `Request["key"]` → 直接得到 `+`(已解碼)。
  4. 若再手動 `HttpUtility.UrlDecode("+")` → `+` 被解析為空格(URL 編碼規範:`+` 代表空格)。

解決方案

方案一:客戶端雙重編碼(最簡單)

// 客戶端 JS
var encoded = encodeURIComponent(encodeURIComponent("+")); // "%252B"
// 服務端自動解碼一次 → "%2B" → 再手動 Decode 一次 → "+"
string raw = Request["key"]; // "%2B"
string real = HttpUtility.UrlDecode(raw); // "+"

方案二:服務端統一處理(推薦)

// 封裝輔助方法
public static string GetRawQueryString(string key) {
    // 從 RawUrl 手動解析,避開 ASP.NET 自動解碼
    var rawUrl = HttpContext.Current.Request.RawUrl; // 含查詢字符串原始內容
    var queryStart = rawUrl.IndexOf('?');
    if (queryStart < 0) return null;
    var query = rawUrl.Substring(queryStart + 1);
    foreach (var pair in query.Split('&')) {
        var kv = pair.Split('=');
        if (kv[0] == key) return kv.Length > 1 ? kv[1] : "";
    }
    return null;
}

// 使用
string raw = GetRawQueryString("key"); // "%2B"
string real = HttpUtility.UrlDecode(raw); // "+"

方案三:Base64 封裝敏感參數(徹底避開特殊字符)

// 客戶端
var payload = btoa(JSON.stringify({ plus: "+", other: "..." })); // Base64
// 服務端
var json = Encoding.UTF8.GetString(Convert.FromBase64String(Request["payload"]));
var obj = JsonConvert.DeserializeObject>(json);
string plus = obj["plus"]; // 精確得到 "+"

核心原則

URL 編碼/解碼必須成對出現,且次數對等。ASP.NET 自動解碼一次,客戶端編碼一次 → 服務端無需再解碼;客戶端編碼兩次 → 服務端手動解碼一次。

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