如何在服务器(服务器端)上检测浏览器中的 cookie 是否被禁用?是否可以?
详细解释:我在服务器上处理一个HTTP请求。我想通过Set-Cookie
标题设置一个cookie。那时我需要知道 cookie 是由客户端浏览器设置,还是我设置 cookie 的请求会被忽略。
如何在服务器(服务器端)上检测浏览器中的 cookie 是否被禁用?是否可以?
详细解释:我在服务器上处理一个HTTP请求。我想通过Set-Cookie
标题设置一个cookie。那时我需要知道 cookie 是由客户端浏览器设置,还是我设置 cookie 的请求会被忽略。
发送带有 cookie 集的重定向响应;在处理 cookie 的(特殊)重定向 URL 测试时 - 如果它在那里重定向到正常处理,否则重定向到错误状态。
请注意,这只能告诉您浏览器允许设置 cookie,但不能告诉您设置多长时间。我的 FF 允许我强制所有 cookie 进入“会话”模式,除非该站点被明确添加到例外列表中 - 当 FF 关闭时,无论服务器指定的到期时间如何,此类 cookie 都将被丢弃。这就是我一直运行 FF 的模式。
您可以使用 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 中存储一个值并尝试读取它们并决定是否启用 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 攻击的一种变体)的一些保护细节。阅读更多关于谷歌登录 CSRF 的信息。这样做的一个副作用是,当他们登录时,我可以检查该 cookie 的存在 - 不需要额外的重定向。
尝试将某些内容存储到 cookie 中,然后读取它。如果您没有得到您期望的结果,那么 cookie 可能已被禁用。
我一直用这个:
navigator.cookieEnabled
根据w3schools “所有主要浏览器都支持 cookieEnabled 属性。”。
但是,当我使用表单时,这对我有用,我可以指示浏览器发送附加信息。
检查此代码,它将对您有所帮助。
<?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());
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()
}
cookie 是否“启用”的问题太布尔了。我的浏览器 (Opera) 具有每个站点的 cookie 设置。此外,该设置不是是/否。最有用的形式实际上是“仅会话”,忽略服务器的到期日期。如果设置后直接测试它,它就会在那里。明天就不行了
此外,由于它是您可以更改的设置,因此即使测试 cookie 是否仍然存在,也只会告诉您测试时的设置。我可能已经决定手动接受那个 cookie。如果我不断收到垃圾邮件,我可以(有时会)关闭该网站的 cookie。
如果您只想检查是否启用了会话 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 并将其设置为 UseDeviceProfile,并且如果您支持不支持 cookie 的客户端的无 cookie 模式,那么为什么不对禁用它们的客户端使用自动检测并支持无cookie模式...
我正在使用上面“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
<script>
if (navigator.cookieEnabled) {
// Cookies are enabled
}
else {
// Cookies are disabled
}
</script>
<?php session_start();
if(SID!=null){
echo "Please enable cookie";
}
?>
使用 navigator.CookieEnabled 启用 cookie(它将返回 true 或 false)和 Html 标签 noscript。顺便说一下 navigator.cookieEnabled 是 javascript 所以不要把它输入为 HTML