提问人:Oleksandr Yanovets 提问时间:2/10/2009 最后编辑:Rory O'KaneOleksandr Yanovets 更新时间:2/26/2022 访问量:93279
如何检测服务器端是否禁用了 cookie
How to detect server-side whether cookies are disabled
问:
如何在服务器(服务器端)检测浏览器中的cookie是否被禁用?可能吗?
详细说明:我正在服务器上处理 HTTP 请求。我想通过标头设置一个cookie。那时我需要知道 cookie 是由客户端浏览器设置的,还是我设置 cookie 的请求将被忽略。Set-Cookie
答:
尝试将某些内容存储到 cookie 中,然后读取它。如果您没有得到预期的结果,则 cookie 可能已被禁用。
评论
发送带有 cookie 集的重定向响应;在处理 cookie 的(特殊)重定向 URL 测试时 - 如果存在,则重定向到正常处理,否则重定向到错误状态。
请注意,这只能告诉您浏览器允许设置cookie,但不能告诉您设置了多长时间。我的 FF 允许我强制所有 cookie 进入“会话”模式,除非网站被专门添加到例外列表中 - 当 FF 关闭时,无论指定的服务器到期时间如何,此类 cookie 都将被丢弃。这就是我一直运行 FF 的模式。
评论
我认为没有直接的方法可以检查。最好的方法是在 cookie 中存储一个值,并尝试读取它们并决定是否启用 cookie。
您可以使用 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 时有效!
评论
cookie 是否“启用”的问题过于布尔。我的浏览器 (Opera) 具有每个站点的 cookie 设置。此外,该设置不是“是/否”。实际上,最有用的形式是“仅会话”,忽略服务器的到期日期。如果设置后直接测试,它就会在那里。明天,它不会。
此外,由于这是您可以更改的设置,因此即使测试 cookie 是否仍然存在,也只能告诉您在测试时的设置。我可能已经决定手动接受那个cookie。如果我继续收到垃圾邮件,我可以(有时也会)关闭该网站的 cookie。
评论
下面的答案是很久以前写的。现在,无论好坏,由于各个国家/地区的法律,除非必要,否则至少在用户有机会同意此类机制之前,不需要 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的存在 - 不需要额外的重定向。
如果只想检查是否启用了会话 Cookie(在会话生存期内存存在的 Cookie),请在 web.config 文件中将会话模式设置为“自动检测”,然后 Asp.Net 框架将向客户端浏览器写入一个名为 AspxAutoDetectCookieSupport 的 Cookie。然后,可以在 Request.Cookies 集合中查找此 cookie,以检查客户端上是否启用了会话 Cookie。
例如,在您的 web.config 文件中设置:
<sessionState cookieless="AutoDetect" />
然后检查客户端上是否启用了 Cookie:
if (Request.Cookies["AspxAutoDetectCookieSupport"] != null) { ... }
旁注:默认情况下,此值设置为 UseDeviceProfile,只要客户端支持 Cookie,它就会尝试将 Cookie 写入客户端,即使禁用了 Cookie。我觉得这是默认选项有点奇怪,因为它似乎毫无意义 - 会话将无法在客户端浏览器中禁用 cookie 并将其设置为 UseDeviceProfile,如果您支持不支持 cookie 的客户端的无 cookie 模式,那么为什么不使用自动检测并支持禁用它们的客户端的无 cookie 模式......
评论
我总是用这个:
navigator.cookieEnabled
根据 w3schools 的说法,“所有主流浏览器都支持 cookieEnabled 属性。
但是,当我使用表单时,这对我有用,我可以指示浏览器发送附加信息。
评论
我使用的是上面“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>
使用导航器。CookieEnabled 表示已启用的 cookie(它将返回 true of false)和 Html 标记 noscript。顺便说一句,navigator.cookieEnabled 是 javascript,所以不要以 HTML 的形式输入它
评论
检查此代码,它将对您有所帮助。
<?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());
<?php session_start();
if(SID!=null){
echo "Please enable cookie";
}
?>
该属性返回一个 Boolean 值,该值指定是否在浏览器中启用 CookiecookieEnabled
<script>
if (navigator.cookieEnabled) {
// Cookies are enabled
}
else {
// Cookies are disabled
}
</script>
评论
NodeJS - 服务器端 - Cookie 检查重定向
中间件 - Express Session/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()
}
评论