Nie można uzyskać dostępu do plików cookie z dokumentu.cookie w JS, ale przeglądarka pokazuje, że ciasteczka istnieją

Nie mogę uzyskać dostępu do plików cookie z JavaScript. Muszę odczytać jakąś wartość i wysłać je przez JSON do moich niestandardowych kontroli.

Próbowałem uzyskać dostęp do plików cookie z JS, tak jak to opisano na:

Jak widać na kodzie, jest on widoczny jak kryształ następny:

var c_value = document.cookie;

Kiedy próbuję uzyskać dostęp do wartości document.cookie z Chrome ' a web-debugger, widzę tylko pusty łańcuch w Watch expressions :

Więc nie mogę odczytać wartości ciasteczek, których potrzebuję.

Sprawdziłem nazwę pliku cookie, który wysyłam, aby uzyskać powiązaną wartość jest prawidłowy. Ponadto używam kodu źródłowego w3schools do pobierania plików cookie, jeśli jesteś zainteresowany (ale z drugiego linku, technika jest podobna).

Jak mogę rozwiązać mój problem?

Author: vinzee, 2013-07-06

6 answers

Najprawdopodobniej masz do czynienia z httponly ciasteczkami. {[3] } jest flagą, którą można ustawić na plikach cookie, co oznacza, że nie można do nich uzyskać dostępu przez JavaScript. Ma to na celu zapobieganie złośliwym skryptom kradnącym pliki cookie z poufnymi danymi lub nawet całych sesji.

Więc albo musisz wyłączyć flagę httponly, albo musisz znaleźć inny sposób, aby uzyskać dane do javascript.

Patrząc na Twój kod, powinno być łatwo wyłączyć flagę tylko http:

Response.AddHeader("Set-Cookie", "CookieName=CookieValue; path=/;");
Response.SetCookie(new HttpCookie("session-id") { Value = Guid.NewGuid().ToString(), HttpOnly = false });
Response.SetCookie(new HttpCookie("user-name") { Value = data.Login, HttpOnly = false });

Teraz powinieneś być w stanie dostęp do informacji o plikach cookie z JavaScript. Jednak nie wiem dokładnie, jakie dane próbujesz uzyskać, więc może możesz przejść do innego podejścia i na przykład wyrenderować jakiś atrybut danych na stronie z informacjami, których potrzebujesz, zamiast próbować odczytać plik cookie:

<div id="example" data-info="whatever data you are trying to retrieve"></div>

console.log(document.getElementById('example').getAttribute('data-info'));
 130
Author: PeeHaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-07 00:40:47

Powiedziałbym, że tylko http jest twoim pierwszym winowajcą, ale może to również wystąpić, jeśli nie ustawisz zakresu plików cookie.

Jeśli witryna została przekierowana z innej domeny, musisz przyjrzeć się ustawieniu zakresu pliku cookie. Domena i ścieżka określają zakres pliku cookie, do których adresów URL powinien zostać wysłany plik cookie. W zależności od tego plik cookie może nie być widoczny w odpowiedzi.

Natknąłem się na ten problem podczas ustawiania pliku cookie na udanym logowaniu SAML SSO i nie mogłem pobierz plik cookie z dokumentu, ponieważ nigdy nie został wysłany w ramach żądania.

 3
Author: Tenzin Palber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 17:35:33

Należy również zwracać uwagę na atrybut Path pliku cookie, ponieważ plik cookie jest widoczny tylko w podkatalogach pod Path. Miałem twój problem i rozwiązałem ustawienie ścieżki " / "

 3
Author: ejaenv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-07 10:24:50

Miałem ten sam problem kilka razy. I za każdym razem, to było z innego powodu.

Różne powody:

  • problem pola httpOnly. Był ustawiony na false i próbowałem uzyskać do niego dostęp z konsoli. Ustawienie go na true lub dostęp do niego z kodu źródłowego załatwiły sprawę.
  • problem pola secure. To było true i używałem tylko http.
  • problem Expires / Max-Age. Plik cookie był Nieaktualny i nie był widoczny w document.cookie.
 1
Author: vinzee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-16 18:03:44

Jeśli plik cookie jest ustawiony jako Set-Cookie LUB Set-Cookie2, nie jest częścią kolekcji nagłówków odpowiedzi: http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders%28%29-method

Zwraca wszystkie nagłówki odpowiedzi, z wyjątkiem tych, których nazwa pola To Set-Cookie lub Set-Cookie2.

 0
Author: Dunken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-31 10:11:41

Jeśli używasz bezpiecznego uwierzytelniania, w tym przypadku nie możesz uzyskać dostępu do plików cookie bezpośrednio ze względu na bezpieczeństwo. musisz zmienić jakiś atrybut odpowiedzi po stronie serwera używając poniższego kodu .

Response.AddHeader("Set-Cookie", "CookieName=CookieValue; path=/;");
Response.SetCookie(new HttpCookie("session-id") { Value = Guid.NewGuid().ToString(), HttpOnly = false });
Response.SetCookie(new HttpCookie("user-name") { Value = data.Login, HttpOnly = false });

Ale nie powinieneś, ponieważ może to zmienić bezpieczne na niezabezpieczone, więc musisz znaleźć rozwiązanie, które należy zrobić po stronie serwera, aby usunąć Pliki cookie i umożliwić Ci wykonanie niektórych operacji.

Możliwe jest dokonywanie zmian po stronie serwera.

 0
Author: Manas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-16 17:56:57