Cómo verificar el encabezado de origen en todo el servidor en IIS para evitar CSRF

1

Si bien soy consciente de que el patrón de sincronización es el método recomendado para evitar ataques CSRF, me encuentro en una situación en la que sería mucho más rápido implementar la comprobación del encabezado de origen.

Tenía la esperanza de que sería muy fácil tener un filtro para todo el servidor en IIS (7.5) que me permitiría bloquear las solicitudes POST que provienen de un dominio diferente. Es posible bloquear solicitudes POST y es posible bloquear solicitudes provenientes de un determinado dominio. Sin embargo, parece que no existen filtros que combinen los dos. Así que mi pregunta es:

¿Existe un módulo / manera de bloquear fácilmente las solicitudes POST que provienen de diferentes dominios en IIS 7.5?

    
pregunta Michael 09.06.2015 - 11:22
fuente

1 respuesta

2

Podría hacer esto con un Módulo HTTP personalizado, escrito en ASP.NET. Se requiere ASP.NET para ejecutar el módulo, aunque el resto de su implementación no necesita estar en ASP.NET. Tenga en cuenta que este código no se ha probado, pero debería ponerlo en la línea correcta. Por supuesto, esto no implementa la lógica completa descrita en mi otra respuesta para tratar con CSRF usando Origin , así que solo ofrece cierta protección (es decir, no hay protección del navegador anterior).

Ejemplo adaptado de Tutorial: Crear y registrar un módulo HTTP personalizado .

Crear módulo

using System;
using System.Web;
public class HelloWorldModule : IHttpModule
{
    public HelloWorldModule()
    {
    }

    public String ModuleName
    {
        get { return "HelloWorldModule"; }
    }

    // In the Init function, register for HttpApplication 
    // events by adding your handlers.
    public void Init(HttpApplication application)
    {
        application.BeginRequest += 
            (new EventHandler(this.Application_BeginRequest));
    }

    private void Application_BeginRequest(Object source, 
         EventArgs e)
    {
    // Create HttpApplication and HttpContext objects to access
    // request and response properties.
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;

        if (context.Request["Origin"] != "https://www.example.com")
        {
          // Deny request - spit out 403
        }

    }

    public void Dispose() { }
}

Para registrar el módulo para IIS 6.0 e IIS 7.0 ejecutándose en modo Clásico

<configuration>
  <system.web>
    <httpModules>
      <add name="HelloWorldModule" type="HelloWorldModule"/>
     </httpModules>
  </system.web>
</configuration>

Para registrar el módulo para IIS 7.0 que se ejecuta en modo integrado

<configuration>
  <system.webServer>
    <modules>
      <add name="HelloWorldModule" type="HelloWorldModule"/>
    </modules>
  </system.webServer>
</configuration>

Cuando esté ejecutando MVC, asegúrese de modificar el que está en la raíz (no en la carpeta Views ).

    
respondido por el SilverlightFox 10.06.2015 - 11:36
fuente

Lea otras preguntas en las etiquetas