Cómo detectar en el lado del servidor si las cookies están deshabilitadas

91

¿Cómo puedo detectar en el servidor (del lado del servidor) si las cookies en el navegador están deshabilitadas? ¿Es posible?

Explicación detallada: estoy procesando una solicitud HTTP en el servidor. Quiero configurar una cookie a través del Set-Cookieencabezado. Necesito saber en ese momento si el navegador del cliente establecerá la cookie o si se ignorará mi solicitud para establecer la cookie.

Alexander Yanovets
fuente
¿Dónde? ¿En el navegador (lado del cliente)? ¿O en el servidor? (qué servidor)
Assaf Lavie
7
DETECTAR cookies habilitadas / deshabilitadas en el código del lado del servidor, sí.
Assaf Lavie
te refieres a usar un lenguaje dinámico en lugar de Javascript, las cookies siempre se agregan al navegador del cliente, así que ... ¡no hay servidor!
balexandre

Respuestas:

58

Envíe una respuesta de redireccionamiento con el conjunto de cookies; al procesar la prueba de URL redirigida (especial) para la cookie; si está allí, redirige al procesamiento normal, de lo contrario, redirige a un estado de error.

Tenga en cuenta que esto solo puede indicarle que el navegador permitió que se estableciera la cookie, pero no por cuánto tiempo. Mi FF me permite forzar todas las cookies al modo de "sesión", a menos que el sitio se agregue específicamente a una lista de excepciones; dichas cookies se descartarán cuando FF se apague independientemente del vencimiento especificado por el servidor. Y este es el modo en el que siempre ejecuto FF.

Lawrence Dol
fuente
14
excepto por stackoverflow?
Simon_Weaver
9
A excepción de varios sitios, uno de los cuales es SO.
Lawrence Dol
43

Puede usar Javascript para lograr eso

Biblioteca:

function createCookie(name, value, days) {
    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    else expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, "", -1);
}

function areCookiesEnabled() {
    var r = false;
    createCookie("testing", "Hello", 1);
    if (readCookie("testing") != null) {
        r = true;
        eraseCookie("testing");
    }
    return r;
}

Código para ejecutar:

alert(areCookiesEnabled());

Recuerda

¡Esto solo funciona si Javascript está habilitado!

balexandre
fuente
23
La pregunta es cómo detectar cookies en el lado del servidor. Su código se ejecuta en el lado del cliente.
Adam
2
Lado del servidor - ¡Pero no especificó qué idioma de servidor está usando! Pero el truco es el mismo ... escribir una cookie y ver si está allí ... si está, cookies habilitadas, si no ... deshabilitadas;)
balexandre
14
No importa qué idioma esté usando en el servidor. Esta pregunta se puede responder en términos de solicitudes / respuestas HTTP.
Martijn
7
Ese código Javascript debe ejecutarse en el navegador para detectar si el navegador tiene habilitadas las cookies. No se puede ejecutar en el lado del servidor.
Marqués de Lorne
4
@Adam: aunque el OP preguntó sobre el lado del servidor, si está tratando de informar al usuario que el sitio requiere que las cookies estén habilitadas para funcionar completamente, una prueba de cookies del lado del cliente puede lograrlo (asumiendo que JavaScript está habilitado).
Chris
18

No creo que haya formas directas de comprobarlo. La mejor manera es almacenar un valor en la cookie e intentar leerlos y decidir si las cookies están habilitadas o no.

Shoban
fuente
16

Una forma habitual de comprobar la compatibilidad con cookies es mediante un redireccionamiento.

Es una buena idea hacer esto solo cuando el usuario está intentando hacer algo que inicia una sesión, como iniciar sesión o agregar algo a su carrito. De lo contrario, dependiendo de cómo lo maneje, potencialmente está bloqueando el acceso a todo su sitio para usuarios, o bots, que no admiten cookies.

En primer lugar, el servidor verifica los datos de inicio de sesión de forma normal: si los datos de inicio de sesión son incorrectos, el usuario recibe esa información de forma normal. Si es correcto, entonces el servidor responde inmediatamente con una cookie y una redirección a una página que está diseñada para buscar esa cookie, que puede ser la misma URL pero con alguna marca agregada a la cadena de consulta. Si esa segunda página no recibe la cookie, el usuario recibe un mensaje que indica que no puede iniciar sesión porque las cookies están deshabilitadas en su navegador.

Si ya está siguiendo el patrón Post-Redirect-Get para su formulario de inicio de sesión, entonces esta configuración y verificación de la cookie no agrega ninguna solicitud adicional; la cookie se puede configurar durante la redirección existente y verificada por el destino que se carga después de la redirección.

Ahora, por qué solo hago una prueba de cookies después de una acción iniciada por el usuario que no sea en cada carga de página. He visto sitios que implementan una prueba de cookies en cada página, sin darme cuenta de que esto tendrá efectos en cosas como los motores de búsqueda que intentan rastrear el sitio. Es decir, si un usuario tiene las cookies habilitadas, entonces la cookie de prueba se configura una vez, por lo que solo tiene que soportar un redireccionamiento en la primera página que solicitan y a partir de ese momento no hay redireccionamientos. Sin embargo, para cualquier navegador u otro agente de usuario, como un motor de búsqueda, que no devuelve cookies, cada página podría simplemente resultar en una redirección.

Otro método para verificar el soporte de cookies es con Javascript; de esta manera, no se necesita necesariamente una redirección; puede escribir una cookie y leerla prácticamente de inmediato para ver si se almacenó y luego se recuperó. La desventaja de esto es que se ejecuta en un script en el lado del cliente , es decir, si aún desea que el mensaje sobre si las cookies son compatibles regrese al servidor, entonces aún debe organizarlo, como con una llamada Ajax.

Para mi propia aplicación, implemento alguna protección para los ataques de 'Iniciar sesión CSRF', una variante de los ataques CSRF, estableciendo una cookie que contiene un token aleatorio en la pantalla de inicio de sesión antes de que el usuario inicie sesión, y verificando ese token cuando el usuario envía su inicio de sesión. detalles. Obtenga más información sobre el CSRF de inicio de sesión de Google. Un efecto secundario de esto es que en el momento en que inician sesión, puedo verificar la existencia de esa cookie; no es necesario un redireccionamiento adicional.

thomasrutter
fuente
5

Por lo general, es posible que solo necesite verificar la compatibilidad con cookies después de que el usuario haya realizado alguna acción en el sitio, como enviar un formulario de inicio de sesión, agregar un artículo a su carrito, etc.

Para mí, actualmente, la verificación del soporte de cookies va de la mano con la prevención de CSRF (Cross-Site Request Forgery).

Probablemente debería ir a otra parte para leer más sobre CSRF , pero la idea detrás de esto es que otros sitios pueden engañar a sus usuarios para que envíen un formulario oculto de su elección a su propio sitio. La forma de evitar esto es establecer una cookie cuando el espectador ve un formulario y establecer un token coincidente como un elemento de formulario oculto, y luego, al procesar el formulario, verificar que tanto la cookie como el elemento de formulario oculto se hayan configurado y coincidan entre sí. Si se trata de un intento de ataque CSRF, el sitio no podrá proporcionar el campo oculto para que coincida con la cookie del usuario, porque la cookie del usuario no será legible para ellos bajo la política del mismo origen.

Si se envía un formulario sin cookies, pero contiene un token de apariencia válida, puede concluir que el usuario tiene las cookies deshabilitadas y muestra un mensaje que indica que el usuario debe habilitar las cookies y volver a intentarlo. La otra posibilidad, por supuesto, es que el usuario sea víctima de un intento de ataque CSRF. Por lo tanto, bloquear al usuario cuando la cookie no coincide también tendrá el efecto secundario de prevenir ese ataque.

thomasrutter
fuente
4

Siempre usé esto:

navigator.cookieEnabled

Según w3schools "La propiedad cookieEnabled es compatible con todos los navegadores principales".

Sin embargo, esto funciona para mí cuando estoy usando formularios, donde puedo indicarle al navegador que envíe la información adicional.

usuario1018130
fuente
+1 de mi parte. ¿Alguna razón para los votos negativos? Esta parece una forma razonable de detectar el bloqueo de cookies en JavaScript (y funciona tanto en Chrome como en IE para mí).
Milan Gardian
6
Creo que los votos negativos se deben a que la pregunta específicamente sobre cómo detectar el soporte desde el lado del servidor. Esta es la mejor manera de probar el soporte en el lado del cliente.
TJ VanToll
3
Aparentemente, W3Schools no es una fuente creíble para HTML / Javascript / CSS / etc. información.
BryanH
5
Esto solo prueba si el navegador lo admite. No prueba si está habilitado. Prácticamente todos los navegadores lo admiten, por lo que parece no tener ningún valor. Lo siento.
StuckOnSimpleThings
3

Intente almacenar algo en una cookie y luego léalo. Si no obtiene lo que espera, es probable que las cookies estén desactivadas.

Joonas Pulakka
fuente
Muchos sitios web hacen esto. No es posible (en el servidor) averiguar si las cookies están habilitadas en la primera solicitud, pero puede implementar un breve paso de redireccionamiento para averiguarlo.
Tom Lianza
2

revisa este código, te ayudará.

<?php
session_start();

function visitor_is_enable_cookie() {
    $cn = 'cookie_is_enabled';
    if (isset($_COOKIE[$cn]))
        return true;
    elseif (isset($_SESSION[$cn]) && $_SESSION[$cn] === false)
        return false;

    // saving cookie ... and after it we have to redirect to get this
    setcookie($cn, '1');
    // redirect to get the cookie
    if(!isset($_GET['nocookie']))
        header("location: ".$_SERVER['REQUEST_URI'].'?nocookie') ;

    // cookie isn't availble
    $_SESSION[$cn] = false;
    return false;
}

var_dump(visitor_is_enable_cookie());
usuario2511210
fuente
1

La pregunta de si las cookies están "habilitadas" es demasiado booleana. Mi navegador (Opera) tiene una configuración de cookies por sitio. Además, esa configuración no es sí / no. La forma más útil es de hecho "solo de sesión", ignorando la fecha de caducidad de los servidores. Si lo prueba directamente después de la configuración, estará allí. Mañana no lo hará.

Además, dado que es una configuración que puede cambiar, incluso probar si las cookies permanecen solo le informa sobre la configuración cuando la probó . Podría haber decidido aceptar esa cookie de forma manual. Si sigo recibiendo spam, puedo (y en ocasiones lo haré) simplemente desactivar las cookies para ese sitio.

MSalters
fuente
3
Buen punto, pero solo necesito saber si mi encabezado Set-Cookie dará como resultado que la próxima solicitud del mismo cliente venga con esa cookie o no. No es importante para mí si es permanente o solo de sesión.
Alexander Yanovets
1

Si solo desea verificar si las cookies de sesión (cookies que existen durante la vida útil de la sesión) están habilitadas, configure su modo de sesión en AutoDetect en su archivo web.config, entonces el marco Asp.Net escribirá una cookie en el navegador del cliente llamado AspxAutoDetectCookieSupport . Luego, puede buscar esta cookie en la colección Request.Cookies para verificar si las cookies de sesión están habilitadas en el cliente.

Por ejemplo, en su conjunto de archivos web.config:

<sessionState cookieless="AutoDetect" />

Luego, verifique si las cookies están habilitadas en el cliente con:

if (Request.Cookies["AspxAutoDetectCookieSupport"] != null)  { ... }

Nota al margen : de forma predeterminada, se establece en UseDeviceProfile, que intentará escribir cookies en el cliente siempre que el cliente las admita , incluso si las cookies están desactivadas. Me parece un poco extraño que esta sea la opción predeterminada, ya que parece un poco inútil: las sesiones no funcionarán con las cookies deshabilitadas en el navegador del cliente si está configurado en UseDeviceProfile, y si admite el modo sin cookies para clientes que no admiten cookies , entonces ¿por qué no usar AutoDetect y admitir el modo sin cookies para los clientes que las tienen deshabilitadas ...

magritte
fuente
1
Asume ASP.NET La pregunta original era de tecnología neutral
David Moorhouse
1

Estoy usando una versión mucho más simplificada de la respuesta de "balexandre" anterior. Intenta configurar y leer una cookie de sesión con el único propósito de determinar si las cookies están habilitadas. Y sí, esto requiere que JavaScript también esté habilitado. Por lo tanto, es posible que desee una etiqueta allí si desea tener una.

<script>
// Cookie detection
document.cookie = "testing=cookies_enabled; path=/";
if(document.cookie.indexOf("testing=cookies_enabled") < 0)
{
    // however you want to handle if cookies are disabled
    alert("Cookies disabled");
}
</script>
<noscript>
    <!-- However you like handling your no JavaScript message -->
    <h1>This site requires JavaScript.</h1>
</noscript>
Broote
fuente
1

NodeJS - Lado del servidor - Middleware de redireccionamiento de comprobación de cookies - Sesión exprés / Analizador de cookies

Dependencias

var express = require('express'),
    cookieParser = require('cookie-parser'),
    expressSession = require('express-session')

Middleware

return (req, res, next) => {
  if(req.query.cookie && req.cookies.cookies_enabled)
    return res.redirect('https://yourdomain.io' + req.path)
  if(typeof(req.cookies.cookies_enabled) === 'undefined' && typeof(req.query.cookie) === 'undefined') {
    return res.cookie('cookies_enabled', true, {
      path: '/',
      domain: '.yourdomain.io',
      maxAge: 900000, 
      httpOnly: true,
      secure: process.env.NODE_ENV ? true : false
    }).redirect(req.url + '?cookie=1')
  }
  if(typeof(req.cookies.cookies_enabled) === 'undefined') {
    var target_page = 'https://yourdomain.io' + (req.url ? req.url : '')
    res.send('You must enable cookies to view this site.<br/>Once enabled, click <a href="' + target_page + '">here</a>.')
    res.end()
    return
  }
  next()
}
decodificador7283
fuente
0

La cookieEnabledpropiedad devuelve un valor booleano que especifica si las cookies están habilitadas o no en el navegador.

<script>
if (navigator.cookieEnabled) {
    // Cookies are enabled
}
else {
    // Cookies are disabled
}
</script>
Zameer Khan
fuente
OP quería saber cómo detectarlo en el lado del servidor.
ZiggyTheHamster
Obviamente, tendrá que devolver esa información al servidor de una manera adecuada para su aplicación. Debe quedar claro que es imposible determinar si un navegador tiene habilitadas las cookies sin interactuar con el navegador.
Steve
-1

Utilice navigator.CookieEnabled para las cookies habilitadas (devolverá verdadero o falso) y la etiqueta Html noscript. Por cierto navigator.cookieEnabled es javascript, así que no lo escriba como HTML

MayorMonty
fuente
1
La pregunta es sobre las comprobaciones del lado del servidor, no del lado del cliente.
Evan M
-1
<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>
user3211045
fuente