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:
czy przeglądarka użyje wcześniejszej kopii odwiedzonej strony mimo nagłówka no-cache,
czy przeglądarka użyje wcześniejszej kopii odwiedzonej strony mimo nagłówka no-store,
czy przeglądarka zapisze kopię strony mimo nagłówku no-store, a jeśli tak, to jak ją usunie,
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:
- Internet Explorer 7,
- Firefox 3,
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:
- utworzenie pliku tymczasowego,
- pobranie do pliku zawartości strony,
- wyświetlenie zawartości strony w oparciu o pobrane dane,
- usunięcie pliku,
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
zastosowanie nagłówka no-cache może okazać się niewystarczające, lepiej stosować nagłówek no-store,
- należy liczyć się z tym, że zawartość przeglądanej strony pozostanie na dysku:
w przypadku Firefox3 - pomimo zastosowania nagłówka no-cache,
w przypadku Internet Explorer - pomimo zastosowania nagłówka no-cache lub nagłówka no-store (pliki usunięte),
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.