Açık etki alanına sahip localhost çerezleri


191

Çerezler hakkında bazı temel şeyleri kaçırmam gerekir. Localhost üzerinde, sunucu tarafında bir çerez ayarladığımda ve etki alanını açıkça localhost (veya .localhost) olarak belirlediğimde. çerez bazı tarayıcılar tarafından kabul edilmiyor gibi görünüyor.

Firefox 3.5: Firebug'daki HTTP isteğini kontrol ettim. Ne görüyorum:

Set-Cookie:
    name=value;
    domain=localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

veya (etki alanını .localhost olarak ayarladığımda):

Set-Cookie:
    name=value;
    domain=.localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

Her iki durumda da, çerez saklanmaz.

IE8: Herhangi bir ekstra araç kullanmadım, ancak sonraki isteklerde geri gönderilmediği için çerez de saklanmış gibi görünmüyor.

Opera 9.64: Hem localhost hem de .localhost çalışır , ancak Tercihler'deki çerezlerin listesini kontrol ettiğimde, domain (localhost.local) olarak localhost (liste gruplamasında) olarak listelenmiş olsa bile ayarlanır.

Safari 4: Hem localhost hem de .localhost çalışır , ancak Tercihler'de her zaman .localhost olarak listelenir. Öte yandan, açık bir etki alanı olmayan bir çerez, yalnızca localhost (nokta yok) olarak gösterilir.

Localhost ile ilgili sorun nedir? Bu kadar tutarsızlıklar nedeniyle, yerel ana bilgisayarı içeren bazı özel kurallar olmalıdır. Ayrıca, alan adlarının neden bir noktadan önce gelmesi gerektiği tam olarak açık değil mi? RFC 2109 açıkça şunu belirtmektedir:

Domain özniteliğinin değeri katıştırılmış nokta içermiyor veya bir nokta ile başlamıyor.

Neden? Belge, güvenlikle ilgili bir şey yapması gerektiğini gösterir. İtiraf etmeliyim ki tüm özellikleri okumadım (daha sonra yapabilir), ama biraz garip geliyor. Buna dayanarak, localhost üzerinde çerezleri ayarlamak imkansız olurdu.


14
6 yaşında iplik ve bu hala bir sorun. Chrome v40 kullanıyorum. Buraya bakın .
Gaui

5
Chrome 43 ... hala bir hata.
Evan Carroll

4
Chrome 54 burada, çözülmedi
Vahid Amiri

6
Chrome 73 .. hala aynı sorunla karşı karşıya. :(
Code_Crash

2
Herkes bunu çözebilir mi? Hala aynı s *** ile karşı karşıya .. bu SO cevabı görmek
Bonjour123 4

Yanıtlar:


236

Tasarım gereği, alan adlarında en az iki nokta bulunmalıdır; aksi takdirde tarayıcı bunları geçersiz kabul eder. ( Http://curl.haxx.se/rfc/cookie_spec.html adresindeki referansa bakın )

Üzerinde çalışırken localhostçerez alan adı tamamen atlanmalıdır. Sadece ayarlayarak ""ya NULLya FALSEyerine "localhost"yeterli değildir.

PHP için http://php.net/manual/en/function.setcookie.php#73107 adresindeki yorumlara bakın .

Java Servlet API'siyle çalışıyorsanız, cookie.setDomain("...")yöntemi hiç aramayın .


93
Neden herkes bunu + 1'ing emin değilim, çerez etki alanını boş veya yanlış veya boş dize olarak ayarladım ve localhost ise hala kaydetmiyor.
Justin

5
RFC6265'te etki alanındaki iki nokta hakkında hiçbir şey göremiyorum: tools.ietf.org/html/rfc6265#section-5.2.3 .Net, yerel etki alanınızdaki tüm ana bilgisayarlar için ".local" olarak ayarlandığını söylüyor. Bu Opera / Safari ile tutarlı görünüyor msdn.microsoft.com/tr-tr/library/ckch3yd2.aspx
MandoMando

9
@ Justin: Hm, Domain=tanımlama bilgisini ayarlarken muhtemelen parametreyi tamamen atlamanız gerekir . Etki alanını null veya boş olarak ayarladıysanız, çerçeveniz Domain=parametreyi atlamak yerine bu değerle gönderir ? Örneğin Firebug ile kontrol edin.
sleske

2
@Ralph, bir milyon teşekkürler, bu şey beni birkaç saat deli etti. Umarım Etki Alanı null olarak ayarlıyorum (.Net sunucu yığınındayım) bir cazibe gibi çalışır.
Xose Lluis

4
Bu biraz kötü ifade edilmiştir. "Boş veya yanlış veya boş dizeye ayar", "Çerezin" alan adı "kısmını hiç ayarlamıyor olmalıdır." Örneğin, çerezin etki alanı bölümünü tamamen dışarıda bırakmak için basit bir test kullanmak localhost için çalışır:((domain && domain !== "localhost") ? ";domain="+domain : "")
L0j1k

34

@Ralph Buchfelder ile genel olarak katılıyorum, ancak yerel makinemdeki (örneğin.com, fr.example.com, de.example.com gibi) bir sistemi çoğaltmaya çalışırken deney yaparak bunun bir miktar yükseltilmesi. OS X / Apache / Chrome | Firefox).

/ Etc / hosts komutlarını 127.0.0.1'de bazı hayali alt alanları işaret edecek şekilde düzenledim:

127.0.0.1 localexample.com
127.0.0.1 fr.localexample.com
127.0.0.1 de.localexample.com

Eğer fr.localexample.com üzerinde çalışıyorsam ve domain parametresini dışarıda bırakıyorsam, çerez fr.localexample.com için doğru şekilde saklanır, ancak diğer alt alanlarda görünmez.

Ben ".localexample.com" bir alan kullanıyorsanız, çerez fr.localexample.com için doğru depolanır ve bir diğer alt alan adları görünür.

"Localexample.com" alan adını kullanıyorsanız veya yalnızca "localexample" veya "localhost" alan adını denediğimde, çerez depolanmıyordu.

"Fr.localexample.com" veya ".fr.localexample.com" alan adını kullanırsam, çerez fr.localexample.com için doğru şekilde saklanır ve diğer alt alanlarda (doğru) görünmez olur.

Bu yüzden, neden olması gerektiğini göremesem de, etki alanında en az iki noktaya ihtiyacınız olması gerektiği gibi görünüyor.

Birisi bunu denemek istiyorsa, bazı yararlı kodlar:

<html>
<head>
<title>
Testing cookies
</title>
</head>
<body>
<?php
header('HTTP/1.0 200');
$domain = 'fr.localexample.com';    // Change this to the domain you want to test.
if (!empty($_GET['v'])) {
    $val = $_GET['v'];
    print "Setting cookie to $val<br/>";
    setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain);
}
print "<pre>";
print "Cookie:<br/>";
var_dump($_COOKIE);
print "Server:<br/>";
var_dump($_SERVER);
print "</pre>";
?>
</body>
</html>

30

localhost: Kullanabilirsiniz: domain: ".app.localhost"ve işe yarayacaktır. 'Alan' parametresi 1 veya daha fazla nokta ihtiyacı çerezleri ayarlamak için alan adı olarak. Sonra gibi localhost alt alanda çalışan oturumu olabilir: api.app.localhost:3000.


1
Ayrıca test edilmiş ve içinde, Ekspres 3.x kullanarak, bir node.js sunucuda çalışanexpress.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
Ampt

3
Yerel etki alanları kullanıyorsanız, bu yanıt olarak seçilmelidir! Alt alan adından önce bir nokta koymak sorunumu çözer.
Foxhoundn

1
Peki, bu nereden .app.geliyor? Bazı SPEC'lerin bir parçası mı? Ve tüm uygun olmayan alanlar (iki noktalı olanlar) için geçerli midir? Ayrıca, bu eski tarayıcılarla da çalışır mı? : ^)
user2173353

Ah ... şimdi anlıyorum ... Tarayıcıları kandırmak sadece bir numara. TAMAM.
user2173353

14

Bir çerez 'localhost' özel alanıyla aşağıdaki gibi ayarlandığında ...

Set-Cookie: isim = değer; domain = localhost ; son kullanma tarihi = Per, 16-Temmuz-2009 21:25:05 GMT; yol = /

... daha sonra tarayıcılar en az iki nokta içermediğinden ve özel olarak ele alınan yedi üst düzey alandan biri olmadığından bunu yok sayar .

... ".com", ".edu" ve "va.us" alanlarını önlemek için alan adlarında en az iki (2) veya üç (3) nokta bulunmalıdır. Aşağıda listelenen yedi özel üst düzey alandan birinde başarısız olan herhangi bir alan için yalnızca iki dönem gerekir. Diğer tüm alan adları için en az üç alan gerekir. Yedi özel üst düzey alan şunlardır: "COM", "EDU", "NET", "ORG", "GOV", "MIL" ve "INT".

Yukarıdaki dönem sayısının büyük olasılıkla öncü bir dönem gerektiğini varsaydığını unutmayın. Ancak bu dönem modern tarayıcılarda göz ardı edilir ve muhtemelen ...

en az bir (1) veya iki (2) periyot

Etki alanı özniteliği için varsayılan değerin , çerez yanıtını oluşturan sunucunun ana bilgisayar adı olduğunu unutmayın .

Bu nedenle , localhost için ayarlanmayan çerezler için bir geçici çözüm yalnızca bir alan adı niteliği belirtmemek ve tarayıcının varsayılan değeri kullanmasına izin vermektir; bu, alan adı özelliğinde açık bir değerin yaptığıyla aynı kısıtlamalara sahip görünmemektedir.


DV yapmadım, ancak başkalarının yapmasının nedeninin, cevabınızın gerçekten fazla değer katmaması nedeniyle olduğunu tahmin ediyorum. İki dönem şartı ve alan adı özniteliğini boş bırakmak diğer cevaplarda tartışılmıştır. Ayrıca, bir üst düzey alan adı hakkında eklediğiniz şeyler yanlış görünüyor. Benim tecrübelerime göre bu bir gereklilik değil.
TTT

@TTT Cevabımda biraz TLD'ye bağlı olarak en az 1 ya da iki periyot olması gerektiğini söylediğimden emin değil misiniz? Bu yüzden sorun hakkında biraz arka plan sağladım ve başka bir yerde kapsanmadığını düşündüğüm bir nokta ekledim - kurallar, açık bir alan için ve tarayıcının varsayılan olduğu alan için farklıdır. Bana biraz değer katıyor gibi görünüyor.
Scott Munro

1
Alan adını boş bırakmak (hiç ayarlamamak), Chrome'un çerezi localhost için tutmasına neden OLMAZ. Hala görmezden geliyor. Bunun yalnızca "kalıcı" çerezler (bir son kullanma tarihi belirleyenler) için geçerli olduğunu unutmayın, çünkü yerel ana bilgisayar için "oturum" çerezlerine (bir son kullanma tarihi ayarlamayanlar) dayanacaktır.
Triynko

3

Sonuçlar tarayıcıya göre değişti.

Chrome- 127.0.0.1 çalıştı ancak localhost .localhost ve "" işe yaramadı. Firefox- .localhost çalıştı ancak localhost, 127.0.0.1 ve "" işe yaramadı.

Opera, IE veya Safari'de test etmediniz


3
Sadece Chrome V.22.0.1229.94 m ile test ettim: Bir Domain=parametre vermeden localhost için bir çerez ayarlama çalışır. Domain=aynı zamanda çalışıyor, ama Domain=localhostçalışmıyor.
sleske

3

Bu sorunu kendim gidermek için çok zaman harcadım.

PHP kullanmak ve Bu sayfadaki hiçbir şey benim için işe yaramadı. Sonunda benim kodunda PHP 'session_set_cookie_params () ' güvenli 'parametre her zaman TRUE olarak ayarlandığını fark etti.

Https ile localhost'u ziyaret etmediğim için tarayıcım hiçbir zaman çerezi kabul etmiyordu. Bu yüzden, kodumun bu kısmını, $ local_mERVER ['HTTP_HOST'] 'localhost' olup olmamasına göre 'secure' parametresini koşullu olarak ayarlayacak şekilde değiştirdim. Şimdi iyi çalışıyor.

Umarım bu birine yardımcı olur.


2

Başka bir etki alanından bir çerez ayarlıyorsanız (yani, bir XHR çapraz kaynak isteği yaparak çerezi ayarlarsanız), withCredentialstanımlama bilgisini burada açıklandığı gibi getirmek için kullandığınız XMLHttpRequest'ta niteliği true olarak ayarladığınızdan emin olmanız gerekir.


evet bununla bile. Alanlar arası isteklerle hala çalışmıyor. Tarayıcı - Safari, IE 11
Rohit Kumar

2

kullanabilir localhost.orgveya daha doğrusu .localhost.orgher zaman127.0.0.1


1

Etki alanı olarak 127.0.0.1 kullanarak yerel olarak çok daha iyi şanslar test ettim. Neden olduğundan emin değilim, ancak localhost ve .localhost vb.İle karışık sonuçlar elde ettim.


1

Önerilen düzeltmelerden hiçbiri işe yaramadı - boş, yanlış, iki nokta ekleyerek vb. - işe yaramadı.

Sonunda, yerel ana bilgisayarsa ve şimdi benim için Chrome 38'de çalışıyorsa, alan adını çerezden kaldırdım .

Önceki kod (işe yaramadı):

document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';

Yeni kod (şimdi çalışıyor):

 if(document.domain === 'localhost') {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ;
    } else {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';
    }

1

Ben de aynı sorunu vardı ve ben herhangi bir alan belirtmeden çerez adı 2 nokta koyarak düzelttim.

set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly

1

Kullandığınızda https://<local-domain>ve sonra bir sorun var gibi görünüyor http://<local-domain>. http://Site sonra istekleri ile çerezleri göndermez https://sitesi setleri onları. Yeniden yüklemeyi zorla ve önbelleği temizle yardımcı olmaz. Yalnızca çerezlerin manuel olarak temizlenmesi işe yarar. Ayrıca, bunları https://sayfada temizlersem, sayfa http://tekrar çalışmaya başlar.

"Sıkı güvenli çerezler" ile ilişkili görünüyor. Burada iyi bir açıklama . Bu edilmiş Chrome 58 yayınlandı 2017-04-19 tarihinde.

Görünüşe göre Chrome, adres çubuğu simgesini tıklarken sayfanın protokolüne bağlı olarak doğru çerezleri göstereceğinden hem güvenli çerezleri hem de güvenli olmayan çerezleri kaydetmektedir.

Ancak Developer tools > Application > Cookies, aynı alan adı için aynı adda güvenli bir çerez olduğunda güvenli olmayan bir çerez göstermez veya güvenli olmayan çerezleri herhangi bir istekle göndermez. Bu bir Chrome hatası gibi görünüyor veya bu davranış bekleniyorsa, bir sayfadayken güvenli çerezleri görüntülemenin bir yolu olmalı httpve bunların geçersiz kılındığına dair bir işaret olmalıdır.

Çözüm, bir http sitesi veya https sitesi için olup olmadığına bağlı olarak farklı adlandırılmış çerezler kullanmak ve bunları uygulamanıza özel olarak adlandırmaktır. Bir __Secure-önek, çerezin kesinlikle güvenli olması gerektiğini ve ayrıca güvenli ve güvenli olmayanların çarpışmayacağı için iyi bir uygulama olduğunu gösterir. Ön eklerin başka yararları da vardır.

/etc/hostsHttps ve http erişimi için farklı alan adları kullanmak da işe yarayacaktır, ancak yanlışlıkla yapılan bir https://localhostziyaret aynı adlardaki çerezlerin http://localhostsitelerde çalışmasını engelleyecektir - bu nedenle bu iyi bir çözüm değildir.

Bir Chrome hata raporu gönderdim .


0

document.cookie = değer adı + "=" + değer + ";" + süresi + "; etki alanı =; yol = /";

bu "domain =; yol = /"; çerezi alt alanda çalışacağı için dinamik alan adı alacaktır. localhost'ta test etmek istiyorsanız işe yarayacak


0

Buradaki cevapların hiçbiri benim için işe yaramadı. PHP'yi sayfadaki ilk şey olarak koyarak düzelttim.

Diğer başlıklar gibi, komut dosyasından herhangi bir çıktıdan önce çerezler gönderilmelidir (bu bir protokol kısıtlamasıdır). Bu, herhangi bir çıktıdan önce ve etiketler dahil olmak üzere herhangi bir boşluktan önce bu işleve çağrı yapmanızı gerektirir.

Gönderen http://php.net/manual/en/function.setcookie.php


bunun konuyla hiçbir ilgisi yok, bu sadece başlıklardan önce başka bir çıktı gönderme hatası yapmıyor
Marnes


0

Biraz oynuyordum.

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/

bugünden itibaren Firefox ve Chrome'da çalışıyor. Ancak, curl ile çalışmasını sağlamak için bir yol bulamadım. Host-Header ve --resolve, hayır şans, herhangi bir yardım takdir çalıştı.

Ancak, eğer kıvrılırsa çalışır, eğer

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/

yerine. (Hangi Firefox ile çalışmaz.)


0

Başka bir önemli ayrıntı, son kullanma tarihi = şu tarih saat biçimini kullanmalıdır: Wdy, GG-Pz-YYYY SS: AA: SS GMT ( RFC6265 - Bölüm 4.1.1 ).

Set-Cookie:
  name=value;
  domain=localhost;
  expires=Thu, 16-07-2019 21:25:05 GMT;
  path=/

5
-1 Çerezler için mevcut spesifikasyon , 4 basamaklı yıllara izin verildiğini belirten tools.ietf.org/html/rfc6265 RFC 6265'dir . Bu nedenle, farklı tarayıcıların farklı yorumlayacağı 2 basamaklı yılları kullanmak kötü bir fikirdir.
sleske

Doğru. Ref RFC6265 bölüm 4.1.1
Zen Cart

4
Doğru, ama geri Haziran 2011'de bu RFC bulamadık. Bu bilgi şimdi yanlış olsa da, ben yazarken geri değildi.
Tralamazza

4
Hafif bir şey olarak kabul etmeyin, işler değişir ve hepimizin cevapların güncel kalmasını sağlamaya yardımcı olmamız gerekir. Yanıtınızı @sleske'nin size verdiği en son bilgilerle güncelleyin ve yardımları için ona teşekkür edin.
Matthew Purdon

0

Çok denemeler yaptıktan ve çeşitli yazıları okuduktan sonra bu işe yaradı. Birden fazla çerez ayarlayabilir, geri okuyabilir, zaman negatifini ayarlayabilir ve silebilirim.

func addCookie(w http.ResponseWriter, name string, value string) {
    expire := time.Now().AddDate(0, 0, 1)
    cookie := http.Cookie{
       Name:    name,
       Value:   value,
       Expires: expire,
       Domain:  ".localhost",
       Path:    "/",
    }
    http.SetCookie(w, &cookie)
}

0

Benim için işe yarayan tek şey Path=/çerez üzerine koymaktı.

Ayrıca, yalnızca iki tanesini (Firefox ve Chrome) test etsem de, bir yol özelliğinin varsayılan değeri tarayıcılardan tarayıcılara farklı görünüyor.

Chrome bir çerezi olduğu gibi ayarlamaya çalışır; eğer pathniteliği de atlanırsa Set-Cookiebaşlığında sonra saklanabilir ve göz ardı edilmeyecektir.

Ancak Firefox, açık bir pathniteliği olmasa bile bir çerezi saklar . Sadece istenen yolla ayarladı; isteğimin URL'si buydu /api/v1/usersve yol /api/v1otomatik olarak ayarlandı .

Her neyse, her iki tarayıcı da açık bir alan, yani falan olmasa bile pathayarlandığında çalıştı . Bu nedenle, her tarayıcının çerezleri işleme biçiminde bazı farklılıklar vardır./Domain=localhost

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.