Como detectar do lado do servidor se os cookies estão desativados

Como posso detectar no servidor (lado do servidor) se os cookies no navegador estão desativados? É possível?

Explicação detalhada: Estou processando uma solicitação HTTP no servidor. Eu quero definir um cookie através do header Set-Cookie . Eu preciso saber, nesse momento, se o cookie será definido pelo navegador do cliente ou se minha solicitação para definir o cookie será ignorada.

Envie uma resposta de redirecionamento com o conjunto de cookies; ao processar o teste de URL redirecionado (especial) para o cookie – se houver um redirecionamento para o processamento normal, caso contrário, redirecione para um estado de erro.

Observe que isso só pode dizer a você que o navegador permitiu que o cookie fosse definido, mas não por quanto tempo. Meu FF me permite forçar todos os cookies para o modo “session”, a menos que o site seja especificamente adicionado a uma lista de exceções – tais cookies serão descartados quando o FF for desligado, independentemente da data de expiração especificada pelo servidor. E este é o modo que eu corro FF sempre.

Você pode usar o Javascript para realizar isso

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 executar:

 alert(areCookiesEnabled()); 

Lembrar

Isso só funciona se o Javascript estiver ativado!

Eu não acho que há maneiras diretas de verificar. A melhor maneira é armazenar um valor no cookie e tentar lê-los e decidir se os cookies estão ativados ou não.

Uma maneira comum de verificar o suporte a cookies é por meio de um redirecionamento.

É uma boa ideia fazer isso apenas quando o usuário estiver tentando fazer algo que inicie uma session, como fazer login ou adicionar algo ao carrinho. Caso contrário, dependendo de como você lida com isso, você está potencialmente bloqueando o access ao seu site inteiro para os usuários – ou bots – que não suportam cookies.

Primeiro, o servidor verifica os dados de login normalmente – se os dados de login estiverem errados, o usuário recebe esse feedback normalmente. Se estiver correto, o servidor responderá imediatamente com um cookie e um redirecionamento para uma página projetada para verificar esse cookie – que pode ser apenas o mesmo URL, mas com algum sinalizador adicionado à string de consulta. Se essa segunda página não receber o cookie, o usuário receberá uma mensagem informando que não pode efetuar login porque os cookies estão desabilitados em seu navegador.

Se você já está seguindo o padrão Post-Redirect-Get para seu formulário de login, essa configuração e verificação do cookie não adicionam nenhuma solicitação adicional – o cookie pode ser definido durante o redirecionamento existente e verificado pelo destino que é carregado após o redirecionamento.

Agora, por que só faço um teste de cookie depois de uma ação iniciada pelo usuário que não seja em cada carregamento de página. Eu vi sites implementar um teste de cookie em cada página, sem perceber que isso vai ter efeitos em coisas como os motores de busca tentando rastrear o site. Ou seja, se um usuário tiver cookies ativados, o cookie de teste será definido uma vez, portanto, eles só precisarão passar por um redirecionamento na primeira página solicitada e, a partir de então, não haverá redirecionamentos. No entanto, para qualquer navegador ou outro agente de usuário, como um mecanismo de pesquisa, que não retorna cookies, cada página pode simplesmente resultar em um redirecionamento.

Outro método de verificar o suporte a cookies é com o Javascript – desta forma, nenhum redirecionamento é necessariamente necessário – você pode escrever um cookie e lê-lo de volta virtualmente imediatamente para ver se ele foi armazenado e então recuperado. A desvantagem disso é que ele é executado no script no lado do cliente – ou seja, se você ainda quiser a mensagem sobre se os cookies são suportados para voltar ao servidor, você ainda precisará organizá-los – como com uma chamada Ajax.

Para meu próprio aplicativo, implemento alguma proteção para ataques ‘Login CSRF’, uma variante de ataques CSRF, configurando um cookie contendo um token random na canvas de login antes de o usuário efetuar login e verificando esse token quando o usuário envia seu login detalhes. Leia mais sobre o Login CSRF do Google. Um efeito colateral disso é que, no momento em que eles efetuam login, posso verificar a existência desse cookie – um redirecionamento extra não é necessário.

Eu sempre usei isso:

 navigator.cookieEnabled 

De acordo com w3schools “A propriedade cookieEnabled é suportada em todos os principais navegadores.”

No entanto, isso funciona para mim quando estou usando formulários, onde posso instruir o navegador para enviar as informações adicionais.

Normalmente, você só precisa verificar o suporte a cookies depois que o usuário realizou alguma ação no site, como enviar um formulário de login, adicionar um item ao carrinho e assim por diante.

Para mim, atualmente, verificar o suporte a cookies anda de mãos dadas com a prevenção CSRF (Cross-Site Request Forgery).

Provavelmente você deveria ir a outro lugar para ler mais sobre CSRF , mas a ideia por trás disso é que outros sites podem enganar ou seus usuários a enviar uma forma oculta de sua escolha para seu próprio site. A maneira de contornar isso é definir um cookie quando o visualizador vê um formulário e definir um token correspondente como um elemento de formulário oculto e, ao processar o formulário, verificar se o cookie e o elemento de formulário oculto foram definidos e correspondem um ao outro. Se for uma tentativa de ataque CSRF, o site não poderá fornecer o campo oculto para corresponder ao cookie do usuário, porque o cookie do usuário não será legível para ele na política de mesma origem.

Se um formulário for enviado sem cookies, mas contiver um token de aparência válida, você poderá concluir que o usuário tem cookies desativados e exibe uma mensagem indicando que o usuário deve ativar cookies e tentar novamente. A outra possibilidade, claro, é que o usuário seja vítima de uma tentativa de ataque CSRF. Portanto, bloquear o usuário quando o cookie não corresponder também terá o efeito colateral de impedir esse ataque.

Tente armazenar algo em um cookie e, em seguida, leia-o. Se você não obtiver o que espera, os cookies provavelmente estarão desativados.

verifique este código, ele irá ajudá-lo.

 < ?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()); 

A questão de se os cookies estão “ativados” é muito booleana. Meu navegador (Opera) tem uma configuração de cookie por site. Além disso, essa configuração não é sim / não. A forma mais útil é, na verdade, “somente session”, ignorando a data de expiração dos servidores. Se você testá-lo diretamente após a configuração, ele estará lá. Amanhã não vai.

Além disso, como é uma configuração que você pode alterar, até mesmo testar se os cookies permanecem apenas informa sobre a configuração quando você testou . Eu poderia ter decidido aceitar esse cookie manualmente. Se eu continuar sendo spam, posso (e às vezes, apenas) desativar os cookies para esse site.

Se você quiser apenas verificar se os cookies de session (cookies que existem durante a vida útil da session) estão habilitados, defina seu modo de session como AutoDetect no seu arquivo web.config e, em seguida, o Asp.Net Framework gravará um cookie no navegador do cliente chamado AspxAutoDetectCookieSupport . Você pode então procurar por esse cookie na coleção Request.Cookies para verificar se os cookies de session estão habilitados no cliente.

Por exemplo, no seu conjunto de arquivos web.config:

  

Em seguida, verifique se os cookies estão habilitados no cliente com:

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

Sidenote: Por padrão, isso é definido como UseDeviceProfile, que tentará gravar cookies no cliente, desde que o cliente os suporte , mesmo se os cookies estiverem desabilitados. Eu acho um pouco estranho que esta é a opção padrão, pois parece meio sem sentido – as sessões não funcionam com cookies desativados no navegador do cliente com ele definido como UseDeviceProfile, e se você suporta o modo cookieless para clientes que não suportam cookies , então porque não usar o AutoDetect e apoiar o modo cookieless para clientes que os tenham desativado …

Estou usando uma versão muito mais simplificada da resposta de “balexandre” acima. Ele tenta definir e ler um cookie de session com o único propósito de determinar se os cookies estão ativados. E sim, isso requer que o JavaScript também esteja ativado. Então você pode querer uma tag lá se você quiser ter uma.

   

A propriedade cookieEnabled retorna um valor booleano que especifica se os cookies estão ou não ativados no navegador

  

NodeJS – Lado do Servidor – Middleware de Redirecionamento de Verificação de Cookie – Sintetizador de Sessão / Cookie Express

Dependências

 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.
Once enabled, click here.') res.end() return } next() }

Use navigator.CookieEnabled para cookies ativados (ele retornará true de false) e o noscript da tag Html. A propósito navigator.cookieEnabled é javascript, então não digite como HTML

 < ?php session_start(); if(SID!=null){ echo "Please enable cookie"; } ?>