Request.UrlReferrer 回傳 Uri 物件,包含來源頁面完整 URL(Scheme、Host、Path、Query)。常用於「返回上一頁」、「防盜連」、「記錄流量來源」。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.UrlReferrer != null)
ViewState["ReturnUrl"] = Request.UrlReferrer.ToString();
}
}
protected void btnBack_Click(object sender, EventArgs e)
{
if (ViewState["ReturnUrl"] != null)
Response.Redirect(ViewState["ReturnUrl"].ToString());
}
!IsPostback 且判斷 != null?null,直接 .ToString() 會拋 NullReferenceException。| 情境 | 表現 | 原因與對策 |
|---|---|---|
上一頁用 location.href 或 location.replace() 導向 | Referrer 為 null 或空字串 | JS 導向不發送 Referer 標頭。對策:改用 <a href="..."> 或表單 action 提交;或在 URL 帶入 ?returnUrl=... 參數。 |
A 頁 Page_Load 中 Response.Redirect("B.aspx") | B 頁 Referrer 為 null | 伺服器端 Redirect 發生在瀏覽器尚未渲染 A 頁之前,無 Referer。對策:改用 Server.Transfer(同站內)或 A 頁輸出 <meta http-equiv="refresh"> / JS 延遲導向。 |
| 使用者按 F5 重新整理 | Referrer **不變**(仍為上一頁) | 重新整理保留原 Referer。若邏輯依賴「是否為重新整理」,請改用 IsPostBack 或 Token 機制判斷。 |
<meta name="referrer" content="no-referrer|origin|unsafe-url"> 可控制送出策略。<a href="B.aspx?src=HomePage">,後端讀 Request.QueryString["src"] 最穩定。public class ImageGuard : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string referrerHost = context.Request.UrlReferrer?.Host;
string localHost = context.Request.Url.Host;
if (string.IsNullOrEmpty(referrerHost) || !referrerHost.Equals(localHost, StringComparison.OrdinalIgnoreCase))
{
// 非本站嵌入 → 回傳預設圖或 403
context.Response.StatusCode = 403;
context.Response.WriteFile("~/Images/hotlink-denied.jpg");
return;
}
// 合法請求 → 輸出真實圖片
context.Response.ContentType = "image/jpeg";
context.Response.WriteFile("~/Images/secret.jpg");
}
public bool IsReusable => false;
}
Request.UrlReferrer 方便但**不可完全信任**(用戶端可偽造、瀏覽器/防火牆/Proxy 可能過濾)。!IsPostBack 時存入 ViewState,避免 Postback 覆蓋。