2011-10-04 20 views
7

Las respuestas aquí y en otros sitios están a menudo llenas de advertencias de no confiar en los encabezados HTTP Referrer porque son 'tan fácilmente' falsificados o falsificados.Spoofing Datos HTTP Referrer usando ASP.NET

Antes de ir más lejos, no, no soy bueno, pero sí quiero ejecutar algunas pruebas que dependen de la referencia.

Si bien no me cabe duda de que las advertencias sobre los remitentes falsos son verdaderas, en realidad no puedo encontrar información más detallada sobre cómo que pueden ser manipulados. Incluso el Wikipedia article solo habla de eso en términos generales.

Estoy a punto de jugar con el RefControl addin para FireFox.

Programativamente (en ASP.NET específicamente) UrlReferrer es una propiedad de solo lectura, por lo que no veo cómo puedo despedir solicitudes con datos de referencia falsos si no puedo configurarlo? ¿Realmente tengo que hacerlo manualmente?

¿Cómo usaría ASP.NET para enviar una solicitud a mi sitio con una variable proporcionada por el usuario para rellenar el encabezado de referencia?

EDIT: Según mi comentario abajo, yo quiero tomar idealmente una solicitud entrante, manupulate los datos referenciales y luego pasar la petición a otra página, intacta. Si puedo hacer que aparezca intacto construyendo uno nuevo desde cero y copiando las propiedades originales, entonces eso también está bien.

+0

¿Quiere decir [ WebRequest.Create] (http://msdn.microsoft.com/en-us/library/0aa3d588.aspx) para enviar la solicitud, no ASP.NET? ¿O está probando sus páginas sin examinar realmente una solicitud web, es decir, necesita burlarse de las clases de contexto para poder modificarlas? – Rup

+0

Bueno, pensé que usaría ASP.NET para realizar una especie de solicitud de "transferencia", es decir, cuando visito la página de prueba, simplemente manipula la referencia antes de pasar mi solicitud a otra página. Si puedo hacer eso con WebRequest, ¡la respuesta a su pregunta es "sí"! – Widor

Respuesta

6

No sé si esto es exactamente lo que quiere, pero en general, debe ser capaz de falsificar el valor de la UrlReferer propiedad (incluso si es de sólo lectura) en HttpContext.Current.Request mediante el uso de un poco de reflexión.

Por ejemplo:

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

En VS; estos son los valores antes y después de cambiar el UrlReferrer:

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

Si abre el conjunto System.Web usando ILSpy se dará cuenta de que la propiedad UrlReferrer ve algo como esto:

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

Gracias, esto parece prometedor. Si uso 'Response.Redirect', la referencia falsa no se conserva, pero funciona con' Server.Transfer'. – Widor

+0

@Widor interesante, pero tiene sentido. Response.Redirect realiza una ida y vuelta redonda al navegador y de vuelta al servidor. – Icarus

3

Esto probablemente no le dará lo que quiere. Pero puede editar el Referido de una HttpWebRequest. No creo que haya una forma de editar el referido de su solicitud en contexto.

using System.Net; 

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