No se puede acceder a las cookies desde document.cookie en JS, pero el navegador muestra que existen cookies

79

No puedo acceder a ninguna cookie desde JavaScript. Necesito leer algún valor y enviarlos a través de JSON para mis controles personalizados.

Intenté acceder a las cookies desde JS, como se describe en:

Como puede ver en el código, se ve tan claro como un cristal el siguiente:

var c_value = document.cookie;

Cuando intento acceder al document.cookievalor del depurador web de Chrome, solo veo la cadena vacía en las expresiones de Watch :

Entonces no puedo leer el valor de las cookies, que necesito.

Revisé el nombre de la cookie, que estoy enviando para obtener un valor asociado que ES correcto. Además, estoy usando el código fuente de W3Schools para obtener cookies, si está interesado (pero desde el segundo enlace, la técnica es similar).

¿Cómo puedo solucionar mi problema?

vinzee
fuente
1
@PeeHaa ¿De verdad? No lo sé. Estoy trabajando en el proyecto ASP.NET MVC 4 (Razor) y no sé si es compatible de forma predeterminada con la habilitación de este parámetro. No te enojes conmigo :) Soy un novato en el desarrollo web.
2
Inspeccione la cookie en su navegador y debería decir si es http:
PeeHaa
1
@PeeHaa He inspeccionado, si hay una marca en la columna HTTP en la tabla del visor de cookies en las herramientas web de Chrome, ¿significa que mis cookies son solo HTTP? En caso afirmativo, mi proyecto utiliza cookies solo HTTP y no entiendo cómo solucionar mi problema :(
1
@PeeHaa Sí, tengo ese control. Las cookies se configuran por respuesta del lado del servidor. Estoy usando C # en mi proyecto ASP.NET MVC4. La parte que estoy configurando cookies: ideone.com/fBqtke
1
@PeeHaa entonces, ¿tienes sugerencias, cómo solucionarlo? Estoy buscando en Google ahora mismo. Todos los sitios web sugieren utilizar document.cookiela herramienta web de Chrome que muestra todas mis cookies y comprobaciones en la columna Http. ¿Por qué no es accesible desde el document.cookie?

Respuestas:

129

Lo más probable es que se trate de httponlycookies. httponlyes una bandera que puede establecer en las cookies, lo que significa que no se puede acceder a ellas mediante JavaScript. Esto es para evitar que los scripts maliciosos roben cookies con datos confidenciales o incluso sesiones completas.

Por lo tanto, debe deshabilitar la httponlybandera o debe encontrar otra forma de obtener los datos en su javascript.

Al mirar su código, debería ser fácil deshabilitar el indicador de solo 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 });

Ahora debería poder acceder a la información de las cookies desde JavaScript. Sin embargo, no sé exactamente qué tipo de datos está tratando de obtener, por lo que tal vez pueda optar por otro enfoque y, por ejemplo, representar algún atributo de datos en la página con la información que necesita en lugar de intentar leer la cookie:

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

console.log(document.getElementById('example').getAttribute('data-info'));
PeeHaa
fuente
¡También! por cierto, he encontrado varias informaciones que HttpOnly no protege realmente y es posible que no estén configuradas. ¿Qué piensa usted al respecto?
httponly no es un silverbullet. Pero lo protegerá contra tipos específicos de ataques. owasp.org/index.php/HttpOnly
PeeHaa
3

Yo diría que http solo es su primer culpable, pero esto también puede ocurrir si no establece el alcance de su cookie.

Si el sitio ha sido redirigido desde otro dominio, deberá considerar la configuración del alcance de la cookie. El dominio y la ruta definen el alcance de la cookie, a qué URL se debe enviar la cookie. Dependiendo de esto, es posible que no vea la cookie en su respuesta.

Me encontré con este problema al configurar una cookie en un inicio de sesión SAML SSO exitoso y no pude recuperar la cookie del documento porque nunca se envió como parte de la solicitud.

Tenzin Palber
fuente
3

Preste atención también al atributo Path de la cookie, ya que la cookie solo es visible para los subdirectorios de Path. Tuve tu problema y resolví configurar la ruta "/"

ejaenv
fuente
1

Tuve el mismo problema varias veces. Y cada vez, fue por una razón diferente.

Diferentes razones:

  • problema de httpOnlycampo. Estaba configurado falsey estaba intentando acceder a él desde la consola. Configurarlo trueo acceder a él desde el código fuente funcionó.
  • problema de securecampo. Lo era truey estaba usando solo http.
  • problema de Expires / Max-Age. La cookie estaba desactualizada y no era visible en document.cookie.
vinzee
fuente
0

Si está utilizando alguna autenticación segura, en ese caso no podría acceder a las cookies directamente debido a la seguridad. tienes que cambiar algún atributo de respuesta en el lado del servidor usando el siguiente código.

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

Pero no debe hacerlo porque puede cambiar de seguro a no seguro, por lo que debe encontrar una solución que se haga en el lado del servidor para eliminar las cookies y permitirle realizar algunas operaciones.

Es posible hacer cambios en el lado del servidor.

Manas
fuente