7

此处和其他各种站点上的答案通常充满警告不要信任 HTTP Referrer 标头,因为它们“很容易”被欺骗或伪造。

在我走得更远之前 - 不,我不擅长 - 但我确实想运行一些依赖于推荐人的测试。

虽然我不怀疑关于虚假推荐人的警告是真的,但我真的找不到关于如何操纵它们的详细信息。甚至维基百科的文章也只是笼统地谈论它。

我即将使用 FireFox 的RefControl 插件

以编程方式(特别是在 ASP.NET 中)UrlReferrer是一个只读属性,所以如果我无法设置它,我看不到如何使用虚假的引用数据触发请求?我真的必须手动完成吗?

我将如何使用 ASP.NET 向我的站点发送请求,并使用用户提供的变量来填充引荐来源标头?

编辑:根据我在下面的评论,理想情况下,我希望接收传入请求,操纵引荐来源数据,然后将请求原封不动地传递到另一个页面。如果我可以通过从头开始构建一个新属性并复制原始属性来使其看起来完好无损,那也很好。

4

2 回答 2

6

我不知道这是否正是您想要的,但总的来说,您应该能够通过使用一些反射来欺骗UrlReferer属性的值(即使它是只读的) 。HttpContext.Current.Request

例如:

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;
    }
}
于 2011-10-04T16:25:59.140 回答
3

这可能不会让你得到你想要的。但是您可以编辑 HttpWebRequest 的引用者。我认为没有办法在上下文中编辑您的请求的引用者。

using System.Net;

HttpWebRequest Req= (HttpWebRequest)System.Net.HttpWebRequest.Create("http://somewhere.com/");
Req.Referer = "http://www.fakesite.com";
于 2011-10-04T15:46:27.607 回答