使用Request.UrlReferrer时,是否需要防止格式错误的HTTP标头?

时间:2016-06-06 21:22:34

标签: c# asp.net-mvc http exception-handling

我试图调和我在野外发现的一些意见。一个消息来源说,如果HTTP标头格式错误,在C#Request.UrlReferrer中将抛出System.UriFormatException。另一个说在这种情况下,Request.UrlReferrer实际上不会抛出异常,它只返回null。

那就是说,我正在开发一个能够捕获推荐网址以供将来参考的网络应用程序。我检查它是否为空,以便"不设置为对象的实例"转换为字符串等时错误不会爆发,并且测试结果正常。我也想知道是否应该为潜在的System.UriFormatExceptions包含错误处理。

有没有人碰到这个?谢谢!

编辑:鉴于NightOwl888的答案如下,确实会出现例外情况。多久一次,我不确定,但我宁愿防范它,也不愿冒公共网站上的例外风险。

我只是抓取referralUrl进行日志记录,因此它不会在任何下游应用程序上下文中使用。它只是让格兰威治生,我猜测以下代码应该涵盖我:

 Uri referrer = null;
        try
        {
            referrer = Request.UrlReferrer;
        }
        catch (UriFormatException)
        {
            referrer = null;
        }
        catch (Exception)
        {
            referrer = null;
        }
        var referralUrl = (referrer != null) ? referrer.ToString() : "None Found";

编辑:更改了例外并添加了常规捕获

1 个答案:

答案 0 :(得分:0)

检查System.Web.HttpContext.Current.Request.UrlReferrer的来源会显示以下内容。

public Uri UrlReferrer
{
    get
    {
        if ((this._referrer == null) && (this._wr != null))
        {
            string knownRequestHeader = this._wr.GetKnownRequestHeader(0x24);
            if (!string.IsNullOrEmpty(knownRequestHeader))
            {
                try
                {
                    if (knownRequestHeader.IndexOf("://", StringComparison.Ordinal) >= 0)
                    {
                        this._referrer = new Uri(knownRequestHeader);
                    }
                    else
                    {
                        this._referrer = new Uri(this.Url, knownRequestHeader);
                    }
                }
                catch (HttpException)
                {
                    this._referrer = null;
                }
            }
        }
        return this._referrer;
    }
}

因此,如果网址格式错误,可能会发生UriFormatException,因为HttpException是唯一设置为nullUriFormatException does not inherit from HttpException的类型。

更好的选择可能是使用Request.Headers["Referer"],它会将原始字符串作为pointed out here返回。但请注意标题可以包含任何值(包括不是URL的值)。

IMO,Referer标题只应用于日志记录,因为它不够可靠,无法用于实现任何类型的应用程序功能(除非在缺少某种情况下存在某种备份功能或畸形)。在某些情况下,浏览器可以(并且经常)忽略发送它。