使用ASP.NET欺骗HTTP Referrer数据

7

这里和其他网站上的答案经常充满了警告,不要相信HTTP Referrer头,因为它们很容易被欺骗或伪造。

在我继续之前 - 不,我没有做坏事 - 但我确实想运行一些依赖引荐者的测试。

虽然我不怀疑关于虚假引荐者的警告是正确的,但我真的找不到关于它们如何被操纵的详细信息。甚至维基百科文章也只是以一般性的术语谈论它。

我即将使用FireFox的RefControl插件进行实验。

以编程方式(特别是在ASP.NET中),UrlReferrer是一个只读属性,因此如果我不能设置它,我不知道如何发送带有虚假引荐数据的请求?我真的必须手动执行吗?

我该如何使用ASP.NET发送一个请求到我的网站,并使用用户提供的变量填充引荐标头?
编辑:根据我的下面评论,我理想情况是接收一个传入请求,操作引荐数据,然后将请求传递到另一个页面,保持完整。如果我可以通过从头开始构建一个新请求并复制原始属性来使其看起来完整,那也可以。

你是指使用WebRequest.Create发送请求,而不是ASP.NET吗?还是说你在没有实际经过Web请求的情况下对页面进行单元测试,即需要模拟上下文类以便于修改它们? - Rup
好的,我想我会使用ASP.NET执行一种“透传”请求,即当我访问我的测试页面时,它只是在将我的请求传递到另一个页面之前简单地操作引用者。如果我可以使用WebRequest来做到这一点,那么你的问题的答案就是“是的”! - Widor
2个回答

6
我不知道这是否完全符合您的要求,但通常来说,您应该能够通过一些反射技巧欺骗 HttpContext.Current.RequestUrlReferer 属性的值(即使它是只读的)。
例如:
FieldInfo fi = HttpContext.Current.Request.GetType().GetField("_referrer", BindingFlags.NonPublic | BindingFlags.Instance);

string initialReferer = HttpContext.Current.Request.UrlReferrer.ToString();
if (fi != null)
    fi.SetValue(HttpContext.Current.Request, new Uri("http://example.com"));
string fakedReferer = HttpContext.Current.Request.UrlReferrer.ToString();

在VS中,这些是在更改UrlReferrer之前和之后的值。
initialReferer
"http://localhost/Test/Default.aspx"
fakedReferer
"http://example.com/"

如果你使用ILSpy打开System.Web程序集,你会发现UrlReferrer属性类似于下面的样子:

public Uri UrlReferrer
{
    get
    {
        if (this._referrer == null && this._wr != null)
        {
            string knownRequestHeader = this._wr.GetKnownRequestHeader(36);
            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;
    }
}

谢谢,这看起来很有希望。如果我使用Response.Redirect,假的引荐者将不会被保留,但是使用Server.Transfer却可以正常工作。 - Widor
@Widor 很有趣,但很有道理。Response.Redirect 会在浏览器和服务器之间来回进行一次完整的往返。 - Icarus

3

这可能无法帮助您获得所需的内容。但是您可以编辑HttpWebRequest的Referror。我认为在上下文中没有编辑请求引用程序的方法。

using System.Net;

HttpWebRequest Req= (HttpWebRequest)System.Net.HttpWebRequest.Create("http://somewhere.com/");
Req.Referer = "http://www.fakesite.com";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接