Web Security für alle: X-XSS-Protection Web Security für alle: X-Frame-Options

Web Security für alle: X-Content-Type-Options

Published on Monday, September 26, 2016 4:00:00 AM UTC in Programming & Security

Der Header X-Content-Type-Options ist recht trivial zu implementieren, da er nur einen einzigen Wert annehmen kann: nosniff. Auch was er bewirkt, ist schnell erklärt: er untersagt dem Browser, schwarze Magie zur automatischen Erkennung des Inhalts von Serverantworten anzuwenden. Stattdessen soll er sich strikt an den übermittelten MIME-Type halten. Microsoft erläutert das an einem Beispiel anschaulich: auch wenn eine Serverantwort als Content Type "Text" signalisiert, interpretierte der Internet Explorer den Inhalt eigenständig als HTML, wenn entsprechende Tags vorhanden waren. Dieses Verhalten bietet Potenzial für Angriffsvektoren (XSS), etwa wenn ein Browser Inhalte als Skripte interpretiert und ausführt, die nicht ausgeführt werden sollten. Der genannte Header unterdrückt dies und führt beispielsweise nur aus, was der Server explizit als Skript ausliefert.

Umsetzung

Die Implementierung nutzt dieselbe Basis-Implementierung wie in den letzten Artikeln. Allerdings beschränke ich mich darauf, lediglich das An- und Abschalten des Headers in den Optionen konfigurierbar zu machen.

"XContentType": {
  "IsEnabled": true 
} 
public XContentTypeOptions XContentType { get; set; }

public class XContentTypeOptions
{
    public bool IsEnabled { get; set; }
}

Auch das Erzeugen des Headers in der Middleware ist wenig spannend:

private Task ApplyHeaders(object state)
{
    var context = (HttpContext)state;

    ApplyHstsHeader(context);
    ApplyXFrameOptionsHeader(context);
    ApplyXContentTypeOptionsHeader(context); // <-- ahhh, teh new stuff
            
    return Task.CompletedTask;
}
        
private void ApplyXContentTypeOptionsHeader(HttpContext context)
{
    if (!_options.XContentType.IsEnabled)
    {
        return;
    }

    context.Response.Headers["X-Content-Type-Options"] = "nosniff";
}

Natürlich setzt der Header voraus, dass der Server alle Inhalte mit dem korrekten MIME-Type ausliefert, was bei allen modernen Frameworks und Web Servern aber kein Problem darstellen sollte. Dennoch tut man natürlich gut daran kurz zu testen, ob alles noch funktioniert. Weitere Details kann man bei Mozilla nachlesen, und Microsoft gibt Tipps dazu, wie korrekte MIME-Types auszusehen haben und wie man Auslieferungsfehler in den Developer Tools erkennt.

Ergebnis

Da das Gefahrenpotenzial wohl eher gering ist, wird die Umsetzung dieses Headers auch nicht über alle Maßen in unserem Test honoriert:

grade-with-x-content-type-options-header.png

Immerhin aber wieder ein kleiner Fortschritt in Richtung Bestnote! :)

Tags: ASP.NET Core · XSS