You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 限制customerinfo.aspx仅从同域default.aspx跳转访问的实现问题

问题根因分析
  • 空引用异常触发原因:代码中直接对可能为null的Request.UrlReferrer、Session["customerID"]调用ToString()方法,当用户直接访问customerinfo.aspx时,Session["customerID"]未初始化为null,直接调用方法就会抛出空引用错误。
  • 逻辑判断错误:运算符优先级问题,&&优先级高于||,原有判断逻辑等价于referrer为空 || (来源为空且客户ID为空),完全不符合需求,会出现非法访问放行、合法访问被拦截的问题。
  • 缺少来源页校验:原有逻辑既没校验referrer是否属于同域,也没校验是否来自default.aspx页面,外部站点跳转的带referrer请求会直接放行,不符合业务要求。
修复后完整代码
Uri referrer = HttpContext.Current.Request.UrlReferrer;
// 非法访问判断:满足任意一个条件就跳转回default.aspx
bool isIllegalAccess = referrer == null 
                    || referrer.Host != Request.Url.Host // 非本域来源
                    || !referrer.AbsolutePath.Equals("/default.aspx", StringComparison.OrdinalIgnoreCase) // 不是从default.aspx跳转
                    || (Session["customerID"] == null && string.IsNullOrEmpty(Request.QueryString["customerID"])); // 无有效客户ID

if (isIllegalAccess)
{
    Response.Redirect(url: "default.aspx", endResponse: false);
    return;
}

if (!IsPostBack)
{
    if (!string.IsNullOrEmpty(Request.QueryString["customerID"]))
    {
        Session["customerID"] = Request.QueryString["customerID"];
        customerInfo();
    }
    else
    {
        if (Session["customerID"] == null || string.IsNullOrEmpty(Session["customerID"].ToString()))
        {
            Response.Redirect(url: "default.aspx", endResponse: false);
        }
        else
        {
            customerInfo();
        }
    }
}
修复说明
  1. 所有可能为null的对象调用前先做非空校验,彻底避免空引用异常
  2. 调整逻辑判断结构,明确非法访问的4个拦截条件,完全匹配业务需求
  3. 增加同域校验+来源页校验,确保只有从同域default.aspx跳转的请求才能进入页面后续逻辑

内容的提问来源于stack exchange,提问作者PaulR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:36:01