2011-10-04 48 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";