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

时间:2009-02-10 07:49:51

标签: http cookies server-side

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

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

15 个答案:

答案 0 :(得分:56)

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

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

答案 1 :(得分: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时才有效!

答案 2 :(得分:18)

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

答案 3 :(得分: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 - 不需要额外的重定向。

答案 4 :(得分:5)

我一直用这个:

navigator.cookieEnabled

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

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

答案 5 :(得分:5)

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

目前,对我来说,检查cookie支持与CSRF(跨站点请求伪造)预防同时进行。

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

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

答案 6 :(得分:3)

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

答案 7 :(得分: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());

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

E.g。在您的web.config文件集中:

<sessionState cookieless="AutoDetect" />

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

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

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

答案 10 :(得分: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>

答案 11 :(得分:1)

NodeJS-服务器端-Cookie检查重定向 中间件-Express Session / Cookie Parser

依赖项

https://graph.facebook.com/v3.0/137340177139954/events?access_token={access_token}

中间件

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:-1)

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

答案 14 :(得分:-1)

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