no-cache, no-store

Cel eksperymentu

Celem eksperymentu jest sprawdzenie sposobu, w jaki różne przeglądarki obsługują wartości no-cache oraz no-store nagłówka Cache-Control. Opis protokołu HTTP znajduje się w RFC 2616, konkretnie w sekcji Header Field Definitions. W szczególności interesujące są dwa fragmenty:

W przypadku no-cache przeglądarka nie może użyć poprzednich odpowiedzi od serwera, bez zweryfikowania, że strona jest nadal ważna. W przypadku no-store użycie wcześniejszej kopii nie powinno mieć miejsca nigdy, a co więcej kopia taka nie powinna zostać utworzona. Nagłówek no-store jest zalecany w przypadku istotnych danych:

The purpose of the no-store directive is to prevent the inadvertent release or retention of sensitive information (for example, on backup tapes). The no-store directive applies to the entire message, and MAY be sent either in a response or in a request. (...) If sent in a response, a cache MUST NOT store any part of either this response or the request that elicited it. This directive applies to both non- shared and shared caches. "MUST NOT store" in this context means that the cache MUST NOT intentionally store the information in non-volatile storage, and MUST make a best-effort attempt to remove the information from volatile storage as promptly as possible after forwarding it. 

W szczególności sprawdzeniu sprawdzone będzie:

Przypadki związane z użyciem wcześniejszej kopii dotyczą scenariusza z przyciśnięciem przycisku Wstecz, a nie ponownych odwiedzin na stronie.

Sposób testowania

Dla testów stworzony został katalog na serwerze z plikami test(1,2,3,4,5).html, które są powiązane ze sobą. Test polega na przejściu stron od test1 do test5, a następnie próbie powrotu do poprzednich stron przy pomocy przycisku wstecz w przeglądarkach.

Testowane przeglądarki:

Dla każdej przeglądarki wykonane są dwa testy, raz dla nagłówka no-cache i drugi raz dla nagłówka no-store.

Zachowanie przeglądarek jest monitorowane przy pomocy narzędzi:

Wyniki

Internet Explorer

Cache-Control: no-cache

Zapisywanie na dysk

Przy kliknięciu każdego linku Internet Explorer tworzy plik tymczasowy w Temporary Internet Files, do tego pliku zapisywana jest pobierana strona, a następnie plik jest zamykany:

CreateFile      Temporary Internet Files\Content.IE5\FR35BOSQ\test2[1].htm      SUCCESS Desired Access: Generic 

Write, Read Attributes, Disposition: Create, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: NCI, ShareMode: Read, Write, Delete, AllocationSize: 0, OpenResult: Created

WriteFile       Temporary Internet Files\Content.IE5\FR35BOSQ\test2[1].htm      SUCCESS Offset: 0, Length: 480

CloseFile       Temporary Internet Files\Content.IE5\FR35BOSQ\test2[1].htm      SUCCESS 

Następnie plik jest otwierany, a jego zawartość jest wczytywana przez Internet Explorer. Po wczytaniu zawartości plik jest zamykany:

CreateFile      Temporary Internet Files\Content.IE5\FR35BOSQ\test2[1].htm      SUCCESS Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened

ReadFile        Temporary Internet Files\Content.IE5\FR35BOSQ\test2[1].htm      SUCCESS Offset: 0, Length: 480

CloseFile       Temporary Internet Files\Content.IE5\FR35BOSQ\test2[1].htm      SUCCESS 

Kolejnym etapem jest usunięcie pliku z dysku:

CreateFile      Temporary Internet Files\Content.IE5\FR35BOSQ\test2[1].htm      SUCCESS Desired Access: Read Attributes, Delete, Disposition: Open, Options: Non-Directory File, Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened

!SetDispositionInformationFile  Temporary Internet Files\Content.IE5\FR35BOSQ\test2[1].htm      SUCCESS Delete: True

CloseFile       Temporary Internet Files\Content.IE5\FR35BOSQ\test2[1].htm      SUCCESS 

Po zamknięciu pliku, jest on usuwany z dysku, zgodnie z ustawioną przez funkcję SetDispositionInformationFile dyspozycją.

Podsumowując - obsługa plików tymczasowych przez Internet Explorer dla nagłówka no-cache jest następująca:

Wstecz

Ponieważ plik tymczasowy jest usuwany z dysku, należy spodziewać się, że Internet Explorer odpyta ponownie o niego serwer przy użyciu przycisku Wstecz w przeglądarce. Tak jest w rzeczywistości:

GET /bootcamp/cache/test2.html HTTP/1.1
Accept: */*
Referer: http://puffy/bootcamp/cache/test1.html
Accept-Language: en-US,pl;q=0.5
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
Connection: Keep-Alive
Host: puffy

Cache-Control: no-store

Sposób obsługi no-store przez Internet Explorer jest identyczny z obsługą no-cache. Oznacza to, że przeglądane strony teoretycznie można odzyskać z dysku, mimo ustawienia na nich nagłówka no-store. Można się zastanawiać czy stworzenie pliku tymczasowego i późniejsze jego usunięcie jest zgodne z fragmentem

"MUST NOT store" in this context means that the cache MUST NOT intentionally store the information in non-volatile storage, (...)

Firefox3

Firefox pozwala obejrzeć zawartość cache korzystając z "adresu" about:cache.

Cache-Control: no-cache

Zapisywanie na dysk

Strony oznaczone nagłówkiem no-cache są zapisywane w cache dyskowym Firefox. Są one widoczne w trakcie przeglądania about:cache, można bez problemu zobaczyć zawartość takiej strony.

Wstecz

W przypadku nagłówka no-cache Firefox nie sprawdzi, czy strona na serwerze nie uległa zmianie, lecz skorzysta z wcześniej odwiedzonej kopii strony.

Cache-Control: no-store

Zapisywanie na dysk

Strony oznaczone nagłówkiem no-store nie są zapisywane w cache dyskowym Firefox. Co więcej nie wygląda na to, by były one zapisywane na dysk w jakiejkolwiek postaci.

Wstecz

W przypadku nagłówka no-store Firefox pobierze nową wersję strony z serwera.

Co to w praktyce oznacza

Można zastanawiać się jaka jest realna szansa odzyskania interesujących informacji z usuniętych plików tymczasowych Internet Explorer. Istnieje duża szansa, że pliki te zostaną nadpisane nowymi plikami tymczasowymi.

Dlaczego użycie wcześniej oglądanej kopii strony jest (czasami) niepożądane? W przypadku aplikacji internetowych często dostęp do części aplikacji wymaga uwierzytelnienia. Po wylogowaniu w niektórych przypadkach można uzyskać dostęp do chronionej części aplikacji (konkretnie do wcześniej przeglądanych stron). Wystarczy w tym celu nacisnąć kilka razy przycisk wstecz. Jeśli przeglądarka użyje stron z cache, nie nastąpi odwołanie do serwera, w związku z czym sam fakt zniszczenia sesji przez serwer jest nieistotny, bo przeglądarka o tym nie wie.

NoCacheNoStore (ostatnio edytowane 2008-12-19 20:43:39 przez PawelGolen)