如何在服务器(服务器端)检测浏览器中的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攻击的变体)实施一些保护.细节.阅读更多关于从Google登录CSRF的信息.这样做的副作用是,当他们登录时,我可以检查该cookie是否存在 - 不需要额外的重定向.
通常,您可能只需要在用户对网站执行某些操作后检查cookie支持,例如提交登录表单,将项目添加到购物车等等.
对我来说,检查cookie支持与CSRF(跨站点请求伪造)预防密切相关.
您可能应该去其他地方阅读有关CSRF的更多信息,但其背后的想法是,其他网站可能会欺骗或您的用户提交他们选择的隐藏形式到您自己的网站.解决这个问题的方法是在查看器看到表单时设置cookie,并将匹配的标记设置为隐藏的表单元素,然后在处理表单时,检查cookie和隐藏表单元素是否已设置并相互匹配.如果是企图进行CSRF攻击,则该站点将无法提供与用户cookie相匹配的隐藏字段,因为根据同源策略,用户的cookie将无法读取.
如果提交的表单没有cookie,但它确实包含有效的令牌,那么您可以从中得出结论:用户已禁用cookie并抛出一条消息,指示用户应启用cookie并重试.当然,另一种可能性是用户是企图CSRF攻击的受害者.因此,当cookie不匹配时阻止用户也会产生防止该攻击的副作用.