七大傳值方式對照表
| 方式 |
適用場景 |
優點 |
缺點/注意 |
| QueryString (GET) |
少量非敏感資料、書籤分享、SEO |
簡單、可書籤、可刷新 |
長度限制、明文、不可攜帶大型物件 |
| Form POST |
表單提交、大量資料、檔案上傳 |
無長度限制、相對安全 |
ASP.NET WebForms 預設 PostBack 到自身,跨頁需設定 PostBackUrl |
| Session |
用戶狀態、購物車、多步驟精靈 |
伺服器端儲存、型別豐富、生命週期可控 |
消耗記憶體、預設 InProc 重啟遺失、叢集需 StateServer/SQLServer |
| Application |
全域計數器、快取共用資料 |
全應用程式共享 |
所有用戶可見、併發需鎖定、重啟歸零 |
| Cookie |
記住登入、偏好設定、追蹤 |
持久化、跨 Session 存活 |
大小 4KB、用戶可禁用/刪除、敏感資料需加密 |
| Response.Redirect |
導向新頁、帶 QueryString |
瀏覽器位址列更新、可跨網域 |
兩次請求、失去原頁面 Context |
| Server.Transfer |
同應用程式內轉交、保留表單/QueryString |
單次請求、保留 Context、效能較好 |
瀏覽器位址不變、僅限同應用程式、相對路徑易混淆 |
程式碼快速參考
1. QueryString / Redirect
// 送出
Response.Redirect($"Target.aspx?id=123&name={Server.UrlEncode("中文")}");
// 接收
string id = Request.QueryString["id"];
string name = Request.QueryString["name"];
2. Session
// 寫入
Session["User"] = new UserInfo { Id = 1, Name = "Tom" };
// 讀取
var user = Session["User"] as UserInfo;
3. Cookie
// 寫入(加密建議)
var cookie = new HttpCookie("Pref", "theme=dark") { Expires = DateTime.Now.AddDays(30), HttpOnly = true };
Response.Cookies.Add(cookie);
// 讀取
string theme = Request.Cookies["Pref"]?.Value;
4. Server.Transfer 保留表單資料
// Source.aspx
Server.Transfer("Target.aspx", true); // true = preserveForm
// Target.aspx
string txt = Request.Form["txtInput"]; // 可直接取得來源頁表單值
5. Cross-Page PostBack (WebForms 特有)
<!-- Source.aspx -->
<asp:Button PostBackUrl="Target.aspx" Text="送出" />
// Target.aspx
if (PreviousPage != null)
{
var txt = PreviousPage.FindControl("txtInput") as TextBox;
string val = txt?.Text;
}
選型決策樹
- 資料是否敏感? → 是 → Session / 加密 Cookie / POST
- 資料量大或含檔案? → POST / Session / 暫存檔
- 需要書籤/分享/SEO? → QueryString
- 跨網域? → Redirect + QueryString / Token
- 同應用程式內單純轉交? → Server.Transfer
- 需持久化跨瀏覽器關閉? → Cookie / 資料庫
安全性提醒
- QueryString/Form/Session 皆不可直接信任,後端必須驗證授權與資料完整性。
- 敏感資料(身分證、密碼、金流)嚴禁放入 QueryString/Cookie/ViewState。
- Cookie 設定
HttpOnly=true; Secure=true; SameSite=Lax/Strict。
- Session 固定攻擊防範:登入成功後呼叫
Session.RegenerateID()(需自行實作或用 OWIN)。