Come verificare l'intestazione di origine dell'intero server in IIS per impedire CSRF

1

Considerando che sono consapevole del fatto che il modello di sincronizzazione è l'approccio consigliato per prevenire gli attacchi CSRF, mi trovo in una situazione in cui sarebbe molto più rapido implementare il controllo dell'intestazione di origine.

Speravo che sarebbe stato molto semplice avere un filtro a livello di server in IIS (7.5) che mi permettesse di bloccare le richieste POST provenienti da un dominio diverso. È possibile bloccare le richieste POST ed è possibile bloccare le richieste provenienti da un determinato dominio. Tuttavia, sembra che non esistano filtri che combinano i due. Quindi la mia domanda è:

Esiste un modulo / modo per bloccare facilmente le richieste POST provenienti da domini diversi in IIS 7.5?

    
posta Michael 09.06.2015 - 11:22
fonte

1 risposta

2

Potresti farlo con un modulo HTTP personalizzato, scritto in ASP.NET. È necessario che ASP.NET esegua il modulo, sebbene il resto della distribuzione non sia necessario in ASP.NET. Nota che questo codice non è stato verificato, ma dovrebbe metterti sulla linea giusta. Naturalmente questo non implementa la logica completa descritta in la mia altra risposta per trattare con CSRF usando Origin , quindi offre solo una certa protezione (cioè nessuna vecchia protezione del browser).

Esempio adattato da Procedura dettagliata: creazione e registrazione di un modulo HTTP personalizzato .

Crea modulo

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() { }
}

Per registrare il modulo per IIS 6.0 e IIS 7.0 in esecuzione in modalità classica

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

Per registrare il modulo per IIS 7.0 in esecuzione in modalità integrata

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

Mentre esegui MVC, assicurati di modificare quello nella root (non la cartella Views ).

    
risposta data 10.06.2015 - 11:36
fonte

Leggi altre domande sui tag