2011-10-04 79 views
7

这里和各种其他网站的答案经常充满警告,因为它们“很容易”被欺骗或伪造,所以不会信任HTTP Referrer头。使用ASP.NET欺骗HTTP Referrer数据

在我进一步讨论之前 - 不,我没有做好 - 但我确实想运行一些引用依赖的测试。

虽然我不怀疑有关假冒推荐人的警告是真实的,但我无法真正找到有关如何他们可以被操纵的详细信息。即使是Wikipedia article也只是泛泛而谈。

我正要玩RefControl addin for FireFox。

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

我该如何使用ASP.NET向用户提供的变量发送请求到我的网站以填充引用链接头?

编辑:根据我下面的评论,我最好想接受一个传入的请求,处理引用数据,然后将请求传递到另一页,完好无损。如果我可以通过从零开始构建一个新的并复制原始属性来使出现完好无损,那么也可以。

+0

你的意思[ WebRequest.Create](http://msdn.microsoft.com/en-us/library/0aa3d588.aspx)发送请求,而不是ASP.NET?或者,您是否在未实际通过Web请求的情况下对您的页面进行单元测试,即您需要模拟上下文类以便修改它们? – Rup

+0

嗯,我想我会使用ASP.NET来执行某种“直通”请求,即当我访问我的测试页时,它只是在将请求传递到另一个页面之前操纵引用者。如果我可以用WebRequest来做到这一点,那么你的问题的答案是“是”! – Widor

回答

6

我不知道如果这正是你想要的,但在一般情况下,你应该能够在HttpContext.Current.Request欺骗的UrlReferer属性(即使它只读)的值用位的反射。

例如:

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; 
    } 
} 
+0

谢谢,这看起来很有希望。如果我使用'Response.Redirect',假引用程序不会被保留,但它可以与'Server.Transfer'一起使用。 – Widor

+0

@维多有趣,但有道理。 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";