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


79

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

Я намагався отримати доступ до файлів cookie з JS, як це було описано в:

Як ви можете бачити в коді, він виглядає так само чітко, як кристал наступного:

var c_value = document.cookie;

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

Тому я не можу прочитати значення файлів cookie, які мені потрібні.

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

Як я можу виправити свою проблему?


1
@PeeHaa Справді? Не знаю. Я працюю в рамках проекту ASP.NET MVC 4 (Razor), і не знаю, чи підтримує він за замовчуванням ввімкнення цього параметра. Не гнівайтесь на мене :) Я новачок у веб-розробці.

2
Перевірте файл cookie у вашому браузері, і він повинен вказати, чи є це httponly чи ні.
PeeHaa

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

Також! до речі, я знайшов кілька відомостей, які HttpOnly насправді не захищає і можуть бути не встановлені. Що ви думаєте про це?

httponly - це не срібна куля. Але це захистить вас від конкретних типів атак. owasp.org/index.php/HttpOnly
PeeHaa

3

Я б сказав, що лише http є вашим першим винуватцем, але це також може статися, якщо не встановити обсяг вашого файлу cookie.

Якщо сайт був перенаправлений з іншого домену, вам потрібно буде вивчити налаштування обсягу файлів cookie. Домен і шлях визначає обсяг файлу cookie, на які URL-адреси слід надсилати файли cookie. Залежно від цього, ви не можете побачити файл cookie у своїй відповіді.

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


3

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


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 та дозволити вам виконувати деякі операції.

Це можливо робити зміни на стороні сервера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.