2011-10-04 48 views
7

Câu trả lời ở đây và nhiều trang web khác thường đầy cảnh báo không tin tưởng tiêu đề Liên kết giới thiệu HTTP vì chúng dễ bị giả mạo hoặc giả mạo.Dữ liệu liên kết giới thiệu HTTP giả mạo bằng ASP.NET

Trước khi tôi tiến xa hơn - không, tôi không được tốt - nhưng tôi muốn chạy một số kiểm tra phụ thuộc vào liên kết giới thiệu.

Trong khi tôi không nghi ngờ rằng các cảnh báo về liên kết giả mạo là đúng, tôi thực sự không thể tìm thấy nhiều thông tin chi tiết về số cách thức chúng có thể được điều khiển. Ngay cả các Wikipedia article chỉ nói về nó nói chung.

Tôi sắp phát với RefControl addin cho FireFox.

Có lập trình (đặc biệt là ASP.NET) UrlReferrer là thuộc tính chỉ đọc, vì vậy tôi không thấy cách tôi có thể kích hoạt yêu cầu với dữ liệu liên kết giới thiệu giả nếu tôi không thể đặt? Tôi có thực sự phải làm điều đó theo cách thủ công không?

Làm cách nào để sử dụng ASP.NET để gửi yêu cầu tới trang web của tôi bằng biến do người dùng cung cấp để điền tiêu đề liên kết giới thiệu?

EDIT: Theo nhận xét của tôi bên dưới, tôi lý tưởng muốn đưa ra yêu cầu đến, manupulate dữ liệu liên kết giới thiệu và sau đó chuyển yêu cầu sang trang khác, còn nguyên vẹn. Nếu tôi có thể làm cho nó xuất hiện nguyên vẹn bằng cách tạo một cái mới từ đầu và sao chép các thuộc tính ban đầu, thì điều đó cũng tốt.

+0

Bạn có nghĩa là [ WebRequest.Create] (http://msdn.microsoft.com/en-us/library/0aa3d588.aspx) để gửi yêu cầu, chứ không phải ASP.NET? Hay bạn đang kiểm tra đơn vị các trang của mình mà không thực sự trải qua một yêu cầu web, tức là bạn cần phải thử các lớp ngữ cảnh để bạn có thể sửa đổi chúng? – Rup

+0

Vâng, tôi nghĩ tôi sẽ sử dụng ASP.NET để thực hiện một yêu cầu "passthrough", tức là khi tôi truy cập trang thử nghiệm của mình, nó chỉ thao tác liên kết giới thiệu trước khi chuyển yêu cầu của tôi sang trang khác. Nếu tôi có thể làm điều đó với WebRequest, thì câu trả lời cho câu hỏi của bạn là "có"! – Widor

Trả lời

6

Tôi không biết nếu điều này chính xác những gì bạn muốn, nhưng nói chung, bạn sẽ có thể để spoof giá trị của UrlReferer tài sản (ngay cả khi nó chỉ đọc) trong HttpContext.Current.Request bằng cách sử dụng một chút phản ánh.

Ví dụ:

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(); 

Mở VS; đó là những giá trị trước và sau khi thay đổi UrlReferrer:

initialReferer 
"http://localhost/Test/Default.aspx" 
fakedReferer 
"http://example.com/" 

Nếu bạn mở lắp ráp System.Web sử dụng ILSpy bạn sẽ nhận thấy rằng tài sản UrlReferrer trông giống như sau:

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

Cảm ơn, điều này có vẻ đầy hứa hẹn. Nếu tôi sử dụng 'Response.Redirect', liên kết giả mạo không được giữ nguyên, nhưng nó hoạt động với' Server.Transfer'. – Widor

+0

@Widor thú vị, nhưng có ý nghĩa. Response.Redirect thực hiện một vòng khứ hồi tới trình duyệt và quay lại máy chủ. – Icarus

3

Điều này có thể sẽ không giúp bạn có được những gì bạn muốn. Nhưng bạn có thể chỉnh sửa Referror của một HttpWebRequest. Tôi không nghĩ rằng có một cách để chỉnh sửa liên kết giới thiệu của yêu cầu của bạn trong ngữ cảnh.

using System.Net; 

HttpWebRequest Req= (HttpWebRequest)System.Net.HttpWebRequest.Create("http://somewhere.com/"); 
Req.Referer = "http://www.fakesite.com"; 
Các vấn đề liên quan