Не удается получить доступ к файлам cookie из document.cookie в JS, но браузер показывает, что файлы cookie существуют

79

Я не могу получить доступ к файлам cookie из JavaScript. Мне нужно прочитать какое-то значение и отправить его через JSON для моих пользовательских проверок.

Я пытался получить доступ к файлам cookie из JS, как это описано в:

Как вы можете видеть в коде, следующее:

var c_value = document.cookie;

Когда я пытаюсь получить доступ к document.cookieзначению из веб-отладчика Chrome, я вижу только пустую строку в выражениях Watch :

Поэтому я не могу прочитать значение куки, которое мне нужно.

Я проверил имя файла cookie, которое я отправляю, чтобы получить правильное связанное значение. Кроме того, я использую исходный код W3Schools для получения файлов cookie, если вам интересно (но из 2-й ссылки метод аналогичен).

Как я могу исправить свою проблему?

Винзее
источник
1
@PeeHaa Правда? Я не знаю. Я работаю над проектом ASP.NET MVC 4 (Razor) и не знаю, поддерживает ли он по умолчанию включение этого параметра. Не сердитесь на меня :) Я новичок в веб-разработке.
2
Проверьте файл cookie в своем браузере, и он должен сказать, httponly он или нет.
PeeHaa 06
1
@PeeHaa Я проверил, есть ли проверка в столбце HTTP в таблице просмотра файлов cookie в веб-инструментах Chrome, значит ли это, что мои файлы cookie являются только HTTP? Если да, значит, мой проект использует файлы cookie только для HTTP, и я не понимаю, как исправить мою проблему :(
1
@PeeHaa Да, у меня есть такой контроль. Файлы cookie устанавливаются ответом на стороне сервера. Я использую C # в своем проекте ASP.NET MVC4. Часть, в которой я устанавливаю файлы cookie: ideone.com/fBqtke
1
@PeeHaa, у вас есть предложения, как это исправить? Я сейчас гуглю. Все веб-сайты предлагают использовать веб document.cookie-инструмент Chrome, показывающий все мои файлы cookie и проверки в столбце Http. Почему он недоступен из document.cookie?

Ответы:

129

Скорее всего, вы имеете дело с httponlyфайлами cookie. httponly- это флаг, который вы можете установить для файлов cookie, что означает, что они не могут быть доступны для JavaScript. Это сделано для предотвращения кражи файлов cookie с конфиденциальными данными или даже целых сеансов вредоносными скриптами.

Таким образом, вам нужно либо отключить httponlyфлаг, либо вам нужно найти другой способ получить данные в свой javascript.

Посмотрев на ваш код, будет легко отключить флаг только 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 });

Теперь у вас должна быть возможность получить доступ к информации cookie из JavaScript. Однако я не знаю точно, какие данные вы пытаетесь получить, поэтому, возможно, вы можете выбрать другой подход и, например, отобразить какой-либо атрибут данных на странице с необходимой информацией вместо попытки прочитать файл cookie:

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

console.log(document.getElementById('example').getAttribute('data-info'));
PeeHaa
источник
Также! кстати, я нашел несколько информации, которую HttpOnly не защищает на самом деле и может быть не установлен. Что вы думаете об этом?
httponly - это не серебряная пуля. Но он защитит вас от определенных типов атак. owasp.org/index.php/HttpOnly
PeeHaa 07
3

Я бы сказал, что только http - ваш первый виновник, но это также может произойти, если не указать объем вашего файла cookie.

Если сайт был перенаправлен с другого домена, вам нужно будет изучить настройку области cookie. Домен и путь определяют область действия файла cookie, на какие URL-адреса следует отправлять файл cookie. В зависимости от этого вы можете не увидеть файл cookie в своем ответе.

Я столкнулся с этой проблемой при установке файла cookie для успешного входа в систему SSO SAML и не смог получить файл cookie из документа, потому что он никогда не отправлялся как часть запроса.

Тензин Палбер
источник
3

следите также за атрибутом Path файла cookie, поскольку файл cookie виден только в подкаталогах в Path. У меня была твоя проблема, и я решил установить Путь "/"

Ejaenv
источник
1

У меня была одна и та же проблема несколько раз. И каждый раз по разной причине.

Причины разные:

  • проблема httpOnlyполя. Он был установлен, falseи я пытался получить к нему доступ с консоли. Настройка trueили доступ к нему из исходного кода сделали свое дело.
  • проблема secureполя. Это было, trueи я использовал только http.
  • проблема Expires / Max-Age. Файл cookie устарел, и его не было видно в document.cookie.
Винзее
источник
0

Если вы используете безопасную аутентификацию, тогда вы не можете получить доступ к файлам cookie напрямую из-за безопасности. вам нужно изменить атрибут ответа на стороне сервера, используя приведенный ниже код.

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 });

Но вы не должны этого делать, потому что это может изменить безопасный на небезопасный, поэтому вам нужно найти решение, которое будет выполнено на стороне сервера, чтобы удалить файлы cookie и позволить вам выполнять некоторые операции.

Возможны изменения на стороне сервера.

Манас
источник