Neden hem önbelleksiz hem de depolamasız HTTP yanıtında kullanılmalı?


120

Kullanıcı bilgilerinin sızmasını önlemem söylendi, yalnızca yanıt olarak "önbellek yok" yeterli değil. "Depo yok" da gereklidir.

Cache-Control: no-cache, no-store

Bu spesifikasyonu http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html okuduktan sonra , neden olduğundan hala emin değilim.

Şu anki anlayışım, bunun sadece ara önbellek sunucusu için olduğu. Yanıt olarak "önbelleksiz" olsa bile, ara önbellek sunucusu içeriği yine de geçici olmayan depolamaya kaydedebilir. Ara önbellek sunucusu, kaydedilen içeriği aşağıdaki istek için kullanıp kullanmayacağına karar verecektir. Bununla birlikte, yanıtta "depolamasız" ise, ara önbellek sunucusunun içeriği depolaması beklenmez. Yani daha güvenli.

Hem "önbelleğe gerek yok" hem de "depoya gerek yok" ihtiyacımız olan başka bir neden var mı?


3
no-cachedüşündüğün anlamına gelmez. Aslında, "lütfen tekrar doğrulayın" anlamına gelir.
Erwan Legrand

Yanıtlar:


77

Bunun önbelleklemeyinno-cache anlamına gelmediğini açıklığa kavuşturmalıyım . Aslında, her talepte önbelleğe alınmış herhangi bir yanıtı kullanmadan önce "sunucu ile yeniden doğrulama" anlamına gelir.

must-revalidateÖte yandan, yalnızca kaynak eski kabul edildiğinde yeniden validasyona ihtiyaç duyar.

Sunucu, kaynağın hala geçerli olduğunu söylüyorsa, önbellek temsiliyle yanıt verebilir ve böylece sunucunun tüm kaynağı yeniden gönderme ihtiyacını azaltabilir.

no-storeetkin bir şekilde full do not cache yönergesidir ve temsilin herhangi bir önbellek biçiminde depolanmasını önlemeyi amaçlamaktadır.

Ne olursa olsun söylüyorum, ancak bunu RFC 2616 HTTP spesifikasyonunda not edin:

Geçmiş arabellekleri, bu tür yanıtları normal işlemlerinin bir parçası olarak depolayabilir

Ancak bu, potansiyel olarak no-storedaha güçlü hale getirme girişimiyle daha yeni RFC 7234 HTTP spesifikasyonundan çıkarılır , bkz:

http://tools.ietf.org/html/rfc7234#section-5.2.1.5


18
Neden: Hala soruya cevap hem no-cache ve no-store HTTP yanıt olarak kullanılmalıdır? Değil mi Cache-Control: no-storeyeterli?
Franklin Yu

Tarayıcılar arasında farklılıklar var mı? Çünkü Microsoft docs.microsoft.com/en-us/iis/configuration/system.webServer/… adresindeki bu makale , hiç önbelleğe alma yokmuş gibi bahsetmiyor no-storeve açıklıyor no-cache… Kafam karıştı!
Roel

Alconja'nın cevabı, özellikle sorunun cevabıdır. Cevap verdiğimde, bunu sadece çok yaygın olan bir mikrofonu açıklığa kavuşturmak için yaptım. Lütfen diğer yanıta oy verin!
Luke Puplett

48

Belirli koşullar altında, IE6 Cache-Control: no-cache, yanıt başlıklarında olsa bile dosyaları önbelleğe almaya devam eder.

W3C arasında devletlerno-cache :

Önbellek yok yönergesi bir alan adı belirtmiyorsa, o zaman bir önbellek, kaynak sunucuyla başarılı bir şekilde yeniden doğrulama yapılmadan sonraki bir isteği karşılamak için yanıtı KULLANMAMALIDIR.

Başvurumda, bir sayfayı ziyaret ettiyseniz no-cache üstbilgiye , oturumu kapattıysanız ve ardından tarayıcınıza geri döndüyseniz, IE6 yine de sayfayı önbellekten alır (sunucuya yeni / doğrulama isteği olmadan). no-storeBaşlığa eklemek, bunu yapmayı durdurdu. Ancak W3C'yi kendi sözlerine alırsanız, aslında bu davranışı kontrol etmenin bir yolu yoktur:

Geçmiş arabellekleri bu tür yanıtları normal işlemlerinin bir parçası olarak depolayabilir.

Tarayıcı geçmişi ile normal HTTP önbelleğe alma arasındaki genel farklar , spesifikasyonun belirli bir alt bölümünde açıklanmaktadır .


7
tarayıcınıza tekrar bastığınızda, IE6 sayfayı önbellekten almaz. Sayfayı geçmiş arabelleğinden alır.
Pacerier

1
Chrome 34'te (2014), yine ayarlanması gerekir no-store. Aksi takdirde Chrome, geri düğmesini kullanırken önbelleğe alınmış / arabelleğe alınmış verileri gösterecektir.
2014

4
-1 çünkü ilk cümle, bir tarayıcının no-cacheüstbilgiye sahip bir yanıtı önbelleğe almasının yanlış olduğunu ima eder . Hemen aşağıdaki W3C alıntısı, durumun böyle olmadığını açıkça ortaya koymaktadır; bunun yerine no-cachebaşlık, yanıtın sonraki isteklere hizmet etmek için yeniden kullanılmadan önce yeniden doğrulanması gerektiği anlamına gelir.
Mark Amery

1
Spesifikasyonun ifadesi RFC1616'dan spesifikasyonun mevcut sürümüne ( tools.ietf.org/html/rfc7230 RFC ailesi) geliştirildi. 6 RFC olduğu için bir aile. 2616'yı geçersiz kıldılar.
Arcin B

16

Gönderen HTTP 1.1 spesifikasyonu :

mağaza yok :

Amacının Mağazasızınyönerge, hassas bilgilerin yanlışlıkla serbest bırakılmasını veya saklanmasını önlemektir (örneğin, yedekleme bantlarında). Depolamama yönergesi iletinin tamamı için geçerlidir ve bir yanıtla veya bir istekle gönderilebilir SEÇİMLİK. Bir istekte gönderilirse, bir önbellek bu isteğin herhangi bir bölümünü veya ona verilen yanıtları SAKLAMAMALIDIR. Bir yanıt olarak gönderilirse, bir önbellek bu yanıtın veya onu ortaya çıkaran isteğin herhangi bir bölümünü SAKLAMAMALIDIR. Bu yönerge hem paylaşılmayan hem de paylaşılan önbellekler için geçerlidir. Bu bağlamda "SAKLANMAMALIDIR", önbelleğin bilgileri kasıtlı olarak geçici olmayan depolamada SAKLAMAMASI GEREKİR ve bilgileri ilettikten sonra mümkün olduğunca çabuk bir şekilde geçici depolamadan kaldırmak için en iyi çabayı göstermesi GEREKİR. Bu yönerge bir yanıtla ilişkilendirilse bile, kullanıcılar bu tür bir yanıtı önbelleğe alma sisteminin dışında açıkça depolayabilir (örneğin, "Farklı Kaydet" iletişim kutusu ile). Geçmiş arabellekleri, bu tür yanıtları normal işlemlerinin bir parçası olarak depolayabilir. Bu direktifin amacı, önbellek veri yapılarına beklenmedik erişimler yoluyla yanlışlıkla bilgi verilmesinden endişe duyan belirli kullanıcıların ve hizmet yazarlarının belirtilen gereksinimlerini karşılamaktır. Bu direktifin kullanımı bazı durumlarda gizliliği iyileştirebilirken, gizliliği sağlamak için hiçbir şekilde güvenilir veya yeterli bir mekanizma OLMADIĞI konusunda uyarıyoruz. Özellikle, kötü niyetli veya tehlikeye atılmış önbellekler bu yönergeyi tanımayabilir veya bunlara uymayabilir ve iletişim ağları, gizli dinlemeye karşı savunmasız olabilir. Geçmiş arabellekleri, bu tür yanıtları normal işlemlerinin bir parçası olarak depolayabilir. Bu direktifin amacı, önbellek veri yapılarına beklenmedik erişimler yoluyla yanlışlıkla bilgi verilmesinden endişe duyan belirli kullanıcıların ve hizmet yazarlarının belirtilen gereksinimlerini karşılamaktır. Bu direktifin kullanımı bazı durumlarda gizliliği iyileştirebilirken, gizliliği sağlamak için hiçbir şekilde güvenilir veya yeterli bir mekanizma OLMADIĞI konusunda uyarıyoruz. Özellikle, kötü niyetli veya tehlikeye atılmış önbellekler bu yönergeyi tanımayabilir veya bunlara uymayabilir ve iletişim ağları, gizli dinlemeye karşı savunmasız olabilir. Geçmiş arabellekleri, bu tür yanıtları normal işlemlerinin bir parçası olarak depolayabilir. Bu direktifin amacı, önbellek veri yapılarına beklenmedik erişimler yoluyla yanlışlıkla bilgi verilmesinden endişe duyan belirli kullanıcıların ve hizmet yazarlarının belirtilen gereksinimlerini karşılamaktır. Bu direktifin kullanımı bazı durumlarda gizliliği iyileştirebilirken, gizliliği sağlamak için hiçbir şekilde güvenilir veya yeterli bir mekanizma OLMADIĞI konusunda uyarıyoruz. Özellikle, kötü niyetli veya tehlikeye atılmış önbellekler bu yönergeyi tanımayabilir veya bunlara uymayabilir ve iletişim ağları, gizli dinlemeye karşı savunmasız olabilir. Bu direktifin kullanımı bazı durumlarda gizliliği iyileştirebilirken, gizliliği sağlamak için hiçbir şekilde güvenilir veya yeterli bir mekanizma OLMADIĞI konusunda uyarıyoruz. Özellikle, kötü niyetli veya tehlikeye atılmış önbellekler bu yönergeyi tanımayabilir veya bunlara uymayabilir ve iletişim ağları, gizli dinlemeye karşı savunmasız olabilir. Bu direktifin kullanımı bazı durumlarda gizliliği iyileştirebilirken, gizliliği sağlamak için hiçbir şekilde güvenilir veya yeterli bir mekanizma OLMADIĞI konusunda uyarıyoruz. Özellikle, kötü niyetli veya tehlikeye atılmış önbellekler bu yönergeyi tanımayabilir veya bunlara uymayabilir ve iletişim ağları, gizli dinlemeye karşı savunmasız olabilir.


1
İsteği halihazırda önbelleğe almıyorsanız, bu yanıtın geçici olmayan bir ortamda depolanmasını zaten engellemiyor mu?
Lèse majesté

4
@ Lèsemajesté Çoğu zaman değil. no-cacheve max-age=0öğenin eski sayılacağını söyleyin. Bu, servis edilmeden önce yeniden doğrulanması gerektiği anlamına gelir. Bu, bir önbelleğin dosyayı depolayabileceği ve ardından sunucunun yanıt verebileceği koşullu bir istek gerçekleştirebileceği anlamına gelir 304 NOT MODIFIED. Yanıtın gövdesinin üretilmesi ve gönderilmesi gerekmediğinden, bu açıkça büyük bir avantajdır. Dolayısıyla, bu kadar çok (çoğu?) Önbellekten yararlanmak ,no-cache yanıtları depolayacaktır .
Kevin Cox

14

Tüm önbelleğe almayı önlemek istiyorsanız (örneğin, geri düğmesini kullanırken yeniden yüklemeye zorlamak) ihtiyacınız olan:

  • IE için önbellek yok

  • Firefox için mağaza yok

Bununla ilgili bilgilerim burada:

http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/


6
Internet Explorer için saklamama neden yeterli olmasın? Blog gönderiniz açıklamıyor.
Simon Lieschke

1
Hangi IE sürümünden bahsediyorsunuz?
Pacerier

1
@Pacerier, Muhtemelen IE sürümü ne olursa olsun, yorumu yazdığı sırada en yenisiydi. Wikipedia'ya göre bu IE7 idi. FF için 3'e benziyor. Çoğu insan hala kullanmıyor.
trysis

11

no-storenormal durumlarda gerekli olmamalıdır ve hem hıza hem de kullanılabilirliğe zarar verebilir. HTTP yanıtının, kullanıcı için yarattığı olumsuz etkilerden bağımsız olarak hiçbir zaman bir disk önbelleğine yazılmaması gereken hassas bilgiler içerdiği durumlarda kullanılmak üzere tasarlanmıştır.

Nasıl çalışır:

  • Normalde, tarayıcı gibi bir kullanıcı aracısı bir yanıtın önbelleğe alınmaması gerektiğini belirlese bile, kullanıcı aracısının içindeki nedenlerden ötürü yine de bunu disk önbelleğinde depolayabilir. Bu sürüm, kullanıcının sayfayı tekrar istemediği, ancak tarayıcının bunu yeni bir sayfa görünümü olarak kabul etmediği "kaynağı görüntüle", "geri", "sayfa bilgisi" gibi özellikler için kullanılabilir. ve kullanıcının şu anda görüntülemekte olduğu sürümün aynısını sunmak mantıklı olacaktır.

  • Kullanımı no-store, bu yanıtın depolanmasını engeller, ancak bu, tarayıcının, istenmeyen, sunucu için yeni, ayrı bir istekte bulunmadan "kaynağı görüntüleme", "geri", "sayfa bilgisi" vb. Verme becerisini etkileyebilir. Başka bir deyişle, kullanıcı kaynağı görüntülemeyi deneyebilir ve tarayıcı bunu hafızasında tutmadıysa, ya bunun mümkün olmadığı söylenir ya da sunucuya yeni bir istekte bulunulmasına neden olur. Bu nedenle, no-storeyalnızca , içeriğin önbellekte depolanmamasını sağlamanın önemi, bu özelliklerin düzgün veya hızlı çalışmamasının engellenen kullanıcı deneyiminden daha ağır bastığında kullanılmalıdır.

Şu anki anlayışım, bunun sadece ara önbellek sunucusu için olduğu. Yanıt olarak "önbelleksiz" olsa bile, ara önbellek sunucusu içeriği yine de geçici olmayan depolamaya kaydedebilir.

Bu yanlış. HTTP 1.1 ile uyumlu ara önbellek sunucuları, no-cacheve must-revalidatetalimatlarına uyarak içeriğin önbelleğe alınmamasını sağlar. Bu talimatların kullanılması, yanıtın herhangi bir ara önbellek tarafından önbelleğe alınmamasını ve sonraki tüm isteklerin kaynak sunucuya geri gönderilmesini sağlar.

Ara önbellek sunucusu HTTP 1.1'i desteklemiyorsa Pragma: no-cache, en iyisini kullanmanız ve ummanız gerekir . HTTP 1.1'i desteklemiyorsa no-storeyine de alakasız olduğunu unutmayın.


3
Bir şeyi yanlış anlıyorum çünkü mnot.net/cache_docs/#CACHE-CONTROL sizinle çelişiyor. no-cacheÖnbelleğe almanın tüm avantajlarından ödün vermeden katı tazeliği koruduğunu söylüyor; bu , sunucu 304 Değiştirilmedi ile yanıt verirse önbelleğin depolanması ve yeniden kullanılması anlamına gelir.
Pacerier

-1: önbellek yok, içeriğin önbelleğe alınamayacağı anlamına gelmez. 14.9.1 Önbelleğe Alınabilir Nedir, belirtim şöyle der: "Önbellek yok yönergesi bir alan adı belirtmiyorsa, o zaman bir önbellek, kaynak sunucuyla başarılı bir şekilde yeniden doğrulama yapılmadan sonraki isteği karşılamak için yanıtı KULLANMAMALIDIR." ( w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9. ) Chris Shiflett'in açıkladığı gibi, "bir önbelleğe alma sisteminin önbelleğe alınmış bir kopyayı tutmasını engellemez. Yalnızca önbelleğe alma sisteminin önbelleğini daha önce yeniden doğrulamasını gerektirir müşteriye geri göndermek için. " (HTTP Geliştirici El Kitabı, s 91)
james.garriss

Bu yanıtta yazdıklarımın bu iki yorumu da kapsadığını sanmıyorum - tarayıcıların nasıl yeniden doğrulama yaptıklarından bahsetmedim (örneğin If-Modified-Since / If-None-Match kullanarak) çünkü bunu şu şekilde görmedim ilgili. Önbelleksizin ne için olduğunu örtmeye bile kalkışmadım, bu yüzden @ james.garriss tarafından yapılan yorumun cevabımla nasıl bir ilişkisi olduğunu anlamakta güçlük çekiyorum.
thomasrutter

7

Bir önbelleğe alma sistemi depolamasız olarak doğru bir şekilde uygularsa, önbelleğe gerek duymazsınız. Ama hepsi yapmıyor. Ek olarak, bazı tarayıcılar, depo yokmuş gibi önbellek gerektirmez. Bu nedenle, kesinlikle gerekli olmasa da, muhtemelen her ikisini de dahil etmek en güvenli yoldur.


Ama bütün yapamaz. Meslektaşımı ikna etmek için somut bir örneğe ihtiyacımız var.
Franklin Yu

Bu yorum 6 yıl önce yapıldı. Ne yaptıklarını görmek için önbelleğe alma sunucularının mevcut davranışını incelemeniz gerekir.
james.garriss

6

Sürüm 5'ten 8'e kadar olan Internet Explorer'ın, https ve sunucu gönderimi Cache-Control: no-cacheveya Pragma: no-cacheüstbilgiler aracılığıyla sunulan bir dosyayı indirmeye çalışırken hata vereceğini unutmayın .

Bkz. Http://support.microsoft.com/kb/812935/en-us

Kullanımı Cache-Control: no-storeve Pragma: privatehala işe yarayan en yakın şey gibi görünüyor.


2
İlgili bir SO cevabında önerildiği Cache-Control: no-store, no-cache, must-revalidategibi, çalışmasını sağlamak için tam olarak bu sırayı ayarlayabilirsiniz . Ancak bu bizim senaryomuzda işe yaramadı, ancak yukarıda @basim'in önerdiği şey yaptı. Teşekkürler!
Eirik H

6

Chrome için, bir yeniden ziyarette sayfayı yeniden yüklemek için önbelleksiz kullanılır, ancak geçmişe geri dönerseniz (geri düğmesi) sayfayı yine de önbelleğe alır. Sayfayı geçmişe geri yüklemek için yeniden yüklemek için, depolamasız seçeneğini kullanın. IE'nin her durumda çalışması için yeniden validasyona ihtiyacı vardır.

Bu nedenle, her zaman kullandığım tüm hatalardan ve yanlış yorumlamalardan kaçındığınızdan emin olmak için

Cache-Control: no-store, no-cache, must-revalidate

yeniden yüklendiğinden emin olmak istersem.


2

Aslen önbelleksiz yıllar önce kullanıyorduk ve bazı tarayıcılarda eski içerikle ilgili bazı problemlerle karşılaştık ... Maalesef ayrıntıları hatırlamayın.

O zamandan beri SADECE mağazasız kullanım konusuna karar verdik. O zamandan beri geriye bakmadım veya herhangi bir tarayıcı veya aracı tarafından eski içerikle ilgili tek bir sorun yaşamadım.

Bu alana kesinlikle uygulamaların gerçekliği ve çeşitli RFC'lerde yazılanlar hakimdir. Özellikle birçok vekil, izlemeleri beklenen politikayı kendi politikalarıyla değiştirerek "performansı artırma" konusunda daha iyi bir iş çıkardıklarını düşünme eğilimindedir.


Sanırım Firefox'u tercih eden no-store.
bvdb


-1

OWASP bunu tartışıyor:

Önbellek denetimi yönergeleri arasındaki fark nedir: önbelleksiz ve depolamasız?

Bir yanıttaki no-cache yönergesi, yanıtın sonraki bir isteğe hizmet etmek için kullanılmaması gerektiğini belirtir, yani önbellek başlıkta bu yönergeye sahip bir yanıtı göstermemeli, ancak sunucunun isteğe hizmet etmesine izin vermelidir. Önbelleksiz yönergesi bazı alan adlarını içerebilir; bu durumda, sunucudan sunulması gereken belirtilen alan adları dışında yanıt önbellekten gösterilebilir. Depolamama yönergesi iletinin tamamı için geçerlidir ve önbelleğin yanıtın herhangi bir bölümünü veya onu isteyen herhangi bir isteği saklamaması gerektiğini belirtir.

Bu direktiflerle tamamen güvende miyim?

Hayır. Ancak genel olarak, Expires: 0 (veya UNIX dönemi gibi yeterince eski bir GMT tarihinin) yanı sıra Cache-Control: no-cache, no-store ve Pragma: no-cache kullanın. Pdf, word belgeleri, excel elektronik tabloları vb. Gibi html olmayan içerik türleri, yukarıdaki önbellek kontrol yönergeleri ayarlandığında bile genellikle önbelleğe alınır (bu, sürüme ve zorunlu yeniden doğrulama, pre-check = 0, post-check ek kullanımına göre değişir. = 0, max-age = 0 ve s-maxage = 0 pratikte bazen tarayıcı tuhaflıkları ve HTTP uygulamaları nedeniyle bazı durumlarda tarayıcı kapatıldığında en azından dosya silinmesine neden olabilir). Ayrıca, 'Otomatik Tamamlama' özelliği, tarayıcının, kullanıcı bir formun giriş alanına ne yazarsa yazsın önbelleğe almasına izin verir. Bunu kontrol etmek için, form etiketi veya tek tek giriş etiketleri 'Autocomplete = "Off"' özelliğini içermelidir. Ancak,

Kaynak burada .


Bu yanlış. sunucuyla doğrulamadanno-cache kullanamayacağınızı söylüyor . Önbelleğe alınmış kopyanız hala iyiyse, sunucu bir 304 ile yanıt verir ve ardından önbelleğe alınmış kopyanızı kullanırsınız. Size potansiyel olarak büyük bir ağ indirmesi kaydeder. Öte yandan verileri hiçbir şekilde önbelleğe almanıza izin verilmediğini söylüyor. no-store
Gargoyle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.