1880 Stimmen

Wie können wir die Zwischenspeicherung von Webseiten in allen Browsern kontrollieren?

Unsere Untersuchungen haben gezeigt, dass nicht alle Browser die HTTP-Cache-Direktiven in einheitlicher Weise beachten.

Aus Sicherheitsgründen wollen wir nicht, dass bestimmte Seiten in unserer Anwendung zwischengespeichert werden, jemals, durch den Webbrowser. Dies muss mindestens mit den folgenden Browsern funktionieren:

  • Internet Explorer 6+
  • Firefox 1.5+
  • Safari 3+
  • Opera 9+
  • Chrom

Unsere Anforderung kam von einem Sicherheitstest. Nach dem Abmelden von unserer Website konnte man die Schaltfläche "Zurück" drücken und zwischengespeicherte Seiten anzeigen.

29voto

Edward Wilde Punkte 24839

Nach einigen Nachforschungen kamen wir auf die folgende Liste von Kopfzeilen, die die meisten Browser abzudecken scheint:

In ASP.NET haben wir diese mit dem folgenden Snippet hinzugefügt:

Response.ClearHeaders(); 
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0 
Response.AppendHeader("Expires", "Sat, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0 

Gefunden von: http://forums.asp.net/t/1013531.aspx

11voto

Dave Cheney Punkte 5365

Die Verwendung des Pragma-Headers in der Antwort ist ein Ammenmärchen. RFC2616 definiert ihn nur als Anfrage-Header

http://www.mnot.net/cache_docs/#PRAGMA

10voto

kspearrin Punkte 9180

Für ASP.NET Core erstellen Sie eine einfache Middleware-Klasse:

public class NoCacheMiddleware
{
    private readonly RequestDelegate m_next;

    public NoCacheMiddleware( RequestDelegate next )
    {
        m_next = next;
    }

    public async Task Invoke( HttpContext httpContext )
    {
        httpContext.Response.OnStarting( ( state ) =>
        {
            // ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
            httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
            httpContext.Response.Headers.Append( "Pragma", "no-cache" );
            httpContext.Response.Headers.Append( "Expires", "0" );
            return Task.FromResult( 0 );
        }, null );

        await m_next.Invoke( httpContext );
    }
}

dann registrieren Sie es mit Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

Stellen Sie sicher, dass Sie dies irgendwo nach

app.UseStaticFiles();

9voto

Edson Medina Punkte 9007

Es gibt einen Fehler im IE6

Inhalte mit "Content-Encoding: gzip" werden immer zwischengespeichert, auch wenn Sie "Cache-Control: no-cache" verwenden.

http://support.microsoft.com/kb/321722

Sie können die gzip-Komprimierung für IE6-Benutzer deaktivieren (überprüfen Sie den User Agent auf "MSIE 6")

8voto

Dustman Punkte 4797

Diese Richtlinien vermindern kein Sicherheitsrisiko. Sie sollen UAs dazu zwingen, flüchtige Informationen zu aktualisieren, und nicht verhindern, dass UAs Informationen zurückhalten. Siehe diese ähnliche Frage . Zumindest gibt es keine Garantie, dass Router, Proxys usw. die Caching-Richtlinien nicht ebenfalls ignorieren.

Positiv zu vermerken ist, dass Sie den meisten Unternehmen in puncto Sicherheit meilenweit voraus sind, wenn es um den physischen Zugang zu Computern, die Installation von Software und dergleichen geht. Wenn es sich bei den Nutzern dieser Informationen um Mitglieder der Öffentlichkeit handelt, können Sie nur dafür sorgen, dass sie verstehen, dass die Informationen, sobald sie auf ihrem Rechner sind, dieser Rechner ihre Verantwortung, nicht Ihre.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X