如何检测服务器端是否禁用cookie

问题描述 投票:90回答:15

如何在服务器(服务器端)检测浏览器中的cookie是否被禁用?可能吗?

详细说明:我正在服务器上处理HTTP请求。我想通过Set-Cookie标头设置一个cookie。我当时需要知道cookie是由客户端浏览器设置还是我的设置cookie的请求将被忽略。

http cookies server-side
15个回答
56
投票

使用cookie集发送重定向响应;处理cookie的(特殊)重定向URL测试时 - 如果它重定向到正常处理,否则重定向到错误状态。

请注意,这只能告诉您浏览器允许设置cookie,但不能告诉您多长时间。我的FF允许我强制所有cookie进入“会话”模式,除非该网站被特别添加到例外列表中 - 当FF关闭时,无论服务器指定的到期日期如何,这些cookie都将被丢弃。这就是我总是运行FF的模式。


1
投票

如果您只想检查是否启用了会话cookie(会话生命周期中存在的cookie),请在web.config文件中将会话模式设置为AutoDetect,然后Asp.Net框架将cookie写入客户端浏览器名为AspxAutoDetectCookieSupport。然后,您可以在Request.Cookies集合中查找此cookie,以检查客户端上是否启用了会话cookie。

例如。在您的web.config文件集中:

<sessionState cookieless="AutoDetect" />

然后检查客户端上是否启用了cookie:

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

旁注:默认设置为UseDeviceProfile,只要客户端支持cookie,即使禁用了cookie,它也会尝试将cookie写入客户端。我觉得这有点奇怪,这是默认选项,因为它看起来毫无意义 - 如果客户端浏览器中禁用的cookie设置为UseDeviceProfile,并且如果您为不支持cookie的客户端支持cookieless模式,则会话将无效那么为什么不使用AutoDetect并为禁用它们的客户端支持cookieless模式...


1
投票

我正在使用更简化版的“balexandre”的答案。它尝试设置和读取会话cookie,其唯一目的是确定是否启用了cookie。是的,这需要启用JavaScript。因此,如果你想要一个标签,你可能需要一个标签。

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

1
投票

NodeJS - 服务器端 - Cookie检查重定向中间件 - 快速会话/ Cookie解析器

依赖

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

中间件

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

0
投票

cookieEnabled属性返回一个布尔值,指定是否在浏览器中启用了cookie

<script>
if (navigator.cookieEnabled) {
    // Cookies are enabled
}
else {
    // Cookies are disabled
}
</script>

-1
投票

使用navigator.CookieEnabled启用cookie(它将返回true为false)和Html标签noscript。顺便说一句navigator.cookieEnabled是javascript所以不要输入HTML格式


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

45
投票

您可以使用Javascript来完成它

图书馆:

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

要运行的代码:

alert(areCookiesEnabled());

记得

这只适用于启用Javascript的情况!


18
投票

我不认为有直接的方法来检查。最好的方法是在cookie中存储一个值并尝试读取它们并决定是否启用cookie。


16
投票

检查cookie支持的常用方法是通过重定向。

当用户尝试执行启动会话的操作(例如登录或向其购物车添加内容)时,这样做是个好主意。否则,根据您的处理方式,您可能会阻止对不支持Cookie的用户(或机器人)访问整个网站。

首先,服务器正常检查登录数据 - 如果登录数据错误,则用户正常接收该反馈。如果它是正确的,那么服务器立即响应一个cookie并重定向到一个页面,该页面旨在检查该cookie - 这可能只是相同的URL,但在查询字符串中添加了一些标志。如果该第二页未收到cookie,则用户会收到一条消息,指出他们无法登录,因为cookie已在其浏览器上禁用。

如果您已经按照登录表单的Post-Redirect-Get模式进行操作,那么此设置和检查cookie不会添加任何其他请求 - 可以在现有重定向期间设置cookie,并由加载的目标检查重定向后。

现在为什么我只在用户启动的操作之后进行cookie测试,而不是每次加载页面。我看到网站在每一页上都实施了一个cookie测试,没有意识到这会对搜索引擎试图抓取网站等问题产生影响。也就是说,如果用户启用了cookie,那么测试cookie将被设置一次,因此他们只需要在他们请求的第一页上忍受重定向,从那时起就没有重定向。但是,对于任何不返回cookie的浏览器或其他用户代理(如搜索引擎),每个页面都只能导致重定向。

检查cookie支持的另一种方法是使用Javascript - 这样,不需要重定向 - 您可以编写一个cookie并立即将其读回来查看它是否已存储然后检索。这样做的缺点是它在客户端的脚本中运行 - 即如果你仍然想要关于是否支持cookie返回服务器的消息,那么你仍然需要组织它 - 比如使用Ajax调用。

对于我自己的应用程序,我通过在用户登录之前在登录屏幕上设置包含随机令牌的cookie,并在用户提交登录时检查该令牌,为“登录CSRF”攻击(CSRF攻击的变体)实施一些保护。细节。阅读更多关于从Google登录CSRF的信息。这样做的副作用是,当他们登录时,我可以检查该cookie的存在 - 不需要额外的重定向。


5
投票

我一直用这个:

navigator.cookieEnabled

根据w3schools“所有主流浏览器都支持cookieEnabled属性。”

但是,当我使用表单时,这对我有用,我可以指示浏览器发送附加信息。


5
投票

通常,您可能只需要在用户对网站执行某些操作后检查cookie支持,例如提交登录表单,将项目添加到购物车等等。

对我来说,检查cookie支持与CSRF(跨站点请求伪造)预防密切相关。

您应该去其他地方阅读more about CSRF,但其背后的想法是,其他网站可能会欺骗或您的用户提交他们选择的隐藏形式到您自己的网站。解决这个问题的方法是在查看器看到表单时设置cookie,并将匹配的标记设置为隐藏的表单元素,然后在处理表单时,检查cookie和隐藏表单元素是否已设置并相互匹配。如果是企图进行CSRF攻击,则该站点将无法提供与用户cookie相匹配的隐藏字段,因为根据同源策略,用户的cookie将无法读取。

如果提交的表单没有cookie,但它确实包含有效的令牌,那么您可以从中得出结论:用户已禁用cookie并抛出一条消息,指示用户应启用cookie并重试。当然,另一种可能性是用户是企图CSRF攻击的受害者。因此,当cookie不匹配时阻止用户也会产生防止该攻击的副作用。


3
投票

尝试将某些内容存储到cookie中,然后阅读它。如果你没有得到你期望的,那么cookie可能会被禁用。


2
投票

检查这段代码,它会帮助你。

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

1
投票

cookie是否“启用”的问题太过布尔。我的浏览器(Opera)具有每站点cookie设置。此外,该设置不是是/否。最有用的形式实际上是“仅会话”,忽略了服务器的到期日期。如果您在设置后直接测试它,它将在那里。明天,它不会。

此外,由于这是一个您可以更改的设置,甚至测试cookie是否仍然只是在您测试时告诉您有关设置的信息。我可能已经决定手动接受一个cookie。如果我继续发送垃圾邮件,我可以(有时候会)关闭该网站的cookie。

© www.soinside.com 2019 - 2024. All rights reserved.