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

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

详细的解释:我正在处理服务器上的HTTP请求。 我想通过Set-Cookie头设置一个cookie。 当时我需要知道cookie是否会被客户端浏览器设置,或者我设置cookie的请求将被忽略。

使用cookie集发送redirect响应; 处理cookie的(特殊)redirectURLtesting – 如果它redirect到正常处理,否则redirect到错误状态。

请注意,这只能告诉你浏览器允许设置cookie,但不能设置多长时间。 我的FF允许我强制所有的cookies进入“会话”模式,除非网站被特别添加到一个例外列表 – 当FFclosures时,这些cookie将被丢弃,而不pipe服务器指定的到期时间。 这是我总是运行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支持的常见方法是通过redirect。

只有在用户尝试执行启动会话的某些操作时(例如login或向购物车添加内容),才能做到这一点。 否则,根据您的处理方式,您可能会阻止访问整个网站的用户(或机器人)不支持Cookie。

首先,服务器检查login数据是否正常 – 如果login数据是错误的,用户将正常收到该反馈。 如果是正确的,那么服务器立即响应一个cookie,并redirect到一个页面,该页面用于检查该cookie – 这可能只是相同的URL,但有一些标志添加到查询string中。 如果第二个页面没有收到cookie,那么用户会收到一条消息,指出他们无法login,因为cookie在浏览器中被禁用。

如果您已经为您的login表单执行了Post-Redirect-Get模式,那么此设置和Cookie检查不会添加任何其他请求 – 可以在现有redirect过程中设置Cookie,并且由加载的目的地进行检查redirect后。

现在为什么我只做一个用户发起的行动之后,而不是每个页面加载一个cookietesting。 我已经看到网站在每一个页面上实施cookietesting,没有意识到这将会对尝试抓取网站的search引擎产生影响。 也就是说,如果用户启用了cookie,那么testingcookie将被设置一次,因此他们只需要在他们请求的第一页上进行redirect,从那时起就没有redirect。 但是,对于任何浏览器或其他用户代理,如search引擎,不会返回cookie,每个页面可能只是导致redirect。

检查cookie支持的另一种方法是使用Javascript – 这样,不需要redirect – 您可以编写一个cookie并立即将其读回,以查看它是否存储并检索。 不利的一面是它在客户端的脚本中运行 – 也就是说,如果你仍然想要关于是否支持cookies返回到服务器的消息,那么你仍然必须组织这些 – 比如使用Ajax调用。

对于我自己的应用程序,通过在用户login之前在login屏幕上设置一个包含随机标记的cookie,并在用户提交login信息时检查该标记,对“loginCSRF”攻击(一种CSRF攻击的变体)细节。 详细了解GoogleloginCSRF。 这样做的副作用是,他们login时,我可以检查该cookie的存在 – 一个额外的redirect是没有必要的。

我总是用这个:

 navigator.cookieEnabled 

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

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

通常情况下,您可能只需要在用户对网站采取某些措施(例如提交login表单,将商品添加到购物车等)后检查Cookie支持。

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

你也许应该去其他地方阅读关于CSRF的更多信息 ,但其背后的想法是,其他网站可能会欺骗或您的用户提交他们select隐藏的forms到自己的网站。 解决方法是在查看器查看表单时设置cookie,并将匹配标记设置为隐藏表单元素,然后在处理表单时检查cookie和隐藏表单元素是否已设置并相互匹配。 如果是企图进行的CSRF攻击,则该网站将无法提供隐藏字段以匹配用户的Cookie,因为用户的Cookie在同源策略下不可读取。

如果一个表单没有提交cookie,但是它包含一个有效的标记,那么你可以从中得出结论,用户禁用了cookie,并且抛出一条消息,指出用户应该启用cookie并重新尝试。 当然,另一种可能是用户是企图进行CSRF攻击的受害者。 因此,当cookie不匹配时阻止用户也会有防止这种攻击的副作用。

尝试将某些东西存储到cookie中,然后读取它。 如果你没有得到你所期望的,那么cookies可能被禁用。

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

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

cookie是否“启用”的问题太布尔。 我的浏览器(Opera)有一个每个站点的cookie设置。 此外,该设置不是是/否。 最有用的forms实际上是“仅会话”,忽略了服务器的失效date。 如果你在设置之后直接testing,它将会在那里。 明天,它不会。

而且,因为这是一个可以更改的设置,所以即使testing了cookies是否仍然存在,只会在testing时告诉您设置的设置。 我可能决定手动接受一个cookie。 如果我一直被垃圾邮件,我可以(有时会)只是closures该网站的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模式,那么为什么不使用AutoDetect并支持无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> 

使用navigator.CookieEnabled启用cookies(它将返回false的真)和Html标签无脚本。 顺便navigator.cookieEnabled是JavaScript,所以不要键入它的HTML

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