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(); } } }
修复说明
- 所有可能为null的对象调用前先做非空校验,彻底避免空引用异常
- 调整逻辑判断结构,明确非法访问的4个拦截条件,完全匹配业务需求
- 增加同域校验+来源页校验,确保只有从同域default.aspx跳转的请求才能进入页面后续逻辑
内容的提问来源于stack exchange,提问作者PaulR
相关产品推荐
相关产品推荐

