sli*_*khi 6 javascript cookies
我有这个奇怪的问题,我无法弄清楚,所以我希望比我聪明的人能帮忙!
我有一个网站https://example.com (没有子域名)
我有一些设置cookie的代码,例如
var value="some value";
document.cookie="myCookie="+escape(value)+"; path=/; domain=example.com";
Run Code Online (Sandbox Code Playgroud)
此代码在某些脚本标记的页面加载期间运行.当第一次加载页面时,我看到我的cookie集,并在(chrome)开发工具>应用程序>域列中,我看到它被设置为.example.com带有一个前导点,这很好.
但随后我刷新页面,我的代码再次运行(并且有一个新值被推送到cookie; dunno,如果这很重要).我查看了应用程序选项卡,现在我看到一个"重复"条目myCookie- 一个打开.example.com,另一个打开example.com(没有前导点).值是相同的.这对我来说很奇怪,我不知道为什么会这样.有没有人为什么会出现这种情况?
继续沿着这个兔子洞...我再次刷新页面和更新的myCookie值.example.com,但是那个example.com没有.更奇怪!
同时,我有其他代码试图读取cookie,但显然myCookiecookie example.com取优先,我得到的值,而不是最新值(反映在.example.comcookie中).
我已经尝试在.example.com(domain=.example.com)上明确设置cookie,但上面描述的行为仍然发生.另外,据我所知,我没有办法在javascript中明确引用cookie .example.com- document.cookie只显示example.com一个(但开发工具应用程序选项卡确实显示它?所以这是在javascript中暴露?)
我无法提供该网站的链接,但我可以尝试回答任何人可能需要澄清的问题.
但我的主要问题是:任何人都可以解释这可能发生的原因,或者至少提供一些可能指向正确方向的东西吗?或者失败了,或者一些解决方法明确地从中读取.example.com?
编辑
在这一点上,我最好的猜测是网站上的其他东西,可能是服务器端脚本,正在将cookie重复.example.com到,example.com但仅限于值的变化.但这是纯粹的猜测.我还没有找到任何客户端证明(但是......),我实际上无法访问服务器端的东西.而且无论如何这可能都在吸管.但这是我最好的工作理论ATM回到网站开发人员询问他们...
更新 - 我发现的新内容/澄清
需要明确的是/重述:我的网站上https://example.com有没有 submdomain.
这似乎只发生在我的cookie中,其中值会更改每个页面的负载.值不变的Cookie似乎没有被推.example.com送到example.com.
即使与动态值的饼干,似乎只欺骗.example.com到example.com了第一时间.之后example.com,即使.example.com版本获得新的动态值,cookie值也不会在后续页面加载时更改.
我创建了一个测试脚本,与我目前观察到的这种行为的cookie分开,以便分而治之.我想用尽可能多的设置/读取cookie和blackbox的代码来排除任何恶作剧.
但我看到了同样的行为.我仍然怀疑这是某种服务器wtfery正在进行,就像.example.comcookie在下一个http请求中被发送,然后服务器将它们写回example.com..仅在第一次?这是双重情节扭曲.我无法访问服务器端的东西,但我甚至不知道从哪里开始在网站开发人员看到什么.
另请注意,到目前为止我和我的同事之间,我们测试了设置问题cookie的javascript lib /代码,以及其他6个站点下面的blackbox脚本(根本不属于这个问题站点的所有者/附属)并且无法重现该问题,这进一步使我们怀疑它是某种服务器配置问题(但同样,我们真的不知道从哪里开始).
无论如何,如果它以某种方式帮助任何人,下面是我写的脚本(进一步)测试这个问题.我正在测试总共8个cookie:
domain=example.com了一个静态值domain=example.com用动态值设置domain=.example.com用静态值设置domain=.example.com用动态值设置domain=指定静态值的cookiedomain=指定动态值的cookiedomain=指定了没有值domain=指定没有值#1, #3- 这些最初设置为开启.example.com并且不会example.com在页面刷新时被欺骗
#2, #4- 这些最初开始.example.com.在首页刷新时,原始值将被绑定到example.comcookie /域.在第二次+页面刷新时,example.comcookie值不会更改(保留原始值),并且.example.com版本会在每个页面加载时获得新值.
#5, #7- 这些最初设置为example.com(非.example.com)并且从未打开过版本.example.com.
#6, #8- 这些最初设置为example.com(非.example.com),它们的值更新每个页面加载,并且永远不会有版本.example.com.
测试代码
var s_testCookies = {
getCookieValue: function(a) {
var b = document.cookie.match('(^|;)\\s*' + a + '\\s*=\\s*([^;]+)');
return b ? unescape(b.pop()) : '';
},
getRandomValue: function() {
return '' + (new Date()).getTime() + '|' + Math.floor(Math.random() * 100000);
},
run: function(data) {
var data = data || {};
console.log('------------------------');
console.log('Arg: ', JSON.parse(JSON.stringify(data)));
data.previousValue = s_testCookies.getCookieValue(data.name);
console.log('Previous: ', JSON.parse(JSON.stringify(data)));
data.cookie = data.name + "=" + escape(data.value) + "; path=/;";
data.cookie+= (typeof data.domain!='undefined') && (" domain="+data.domain+";") || "";
document.cookie = data.cookie;
data.newValue = s_testCookies.getCookieValue(data.name);
console.log('New: ', JSON.parse(JSON.stringify(data)));
console.log('------------------------');
}
} // end testCookies
s_testCookies.run({
'message': 'no dot static value',
'domain': 'example.com',
'name': 'test_no_dot_static',
'value': 'no dot static value'
});
s_testCookies.run({
'message': 'no dot dynamic value',
'domain': 'example.com',
'name': 'test_no_dot_dynamic',
'value': s_testCookies.getRandomValue()
});
s_testCookies.run({
'message': 'dot static value',
'domain': '.example.com',
'name': 'test_dot_static',
'value': 'dot static value'
});
s_testCookies.run({
'message': 'dot dynamic value',
'domain': '.example.com',
'name': 'test_dot_dynamic',
'value': s_testCookies.getRandomValue()
});
s_testCookies.run({
'message': 'implicit no domain static value',
'name': 'test_implicit_no_domain_static',
'value': 'implicit no domain static value'
});
s_testCookies.run({
'message': 'implicit no domain dynamic value',
'name': 'test_implicit_no_domain_dynamic',
'value': s_testCookies.getRandomValue()
});
s_testCookies.run({
'message': 'explicit no domain static value',
'domain':'',
'name': 'test_explicit_no_domain_static',
'value': 'explicit no domain static value'
});
s_testCookies.run({
'message': 'explicit no domain dynamic value',
'domain':'',
'name': 'test_explicit_no_domain_dynamic',
'value': s_testCookies.getRandomValue()
});
Run Code Online (Sandbox Code Playgroud)
基于提供的评论/答案的另一个更新
要明确的是,在实践中,问题是我们在页面加载时使用值设置了一些cookie.然后,当页面刷新(或在网站上导航到另一个页面)时,我们读取值,对其执行某些操作,生成新值并再次设置cookie.每次重复加载洗涤漂洗重复.
问题出在初始页面视图上,这些cookie是在.example.com域上设置的.然后在下一页加载时,初始cookie /值被欺骗exampe.com,并且cookie on .example.com获取更新的值.然后在另一个页面加载时,前一个.example.com值不会被欺骗/推送到example.comcookie的版本; 只有.example.com版本更新.因此它只会example.com在第二页加载时被欺骗/推送.不是第3 +.
同时,example.comcookie优先,并且document.cookie在我们解析cookie值时返回.因此,在第3页+页面加载时,我们只是继续从该example.comcookie 返回的页面#2 中的值,而不是更新的值.example.com
同时,我们不能简单地指定一个domain=值(#6 or #8上图),因为事实上存在子域,例如mobile.example.com也有读取/更新/写入这些cookie的代码,如果我们没有指定域,那么cookie只是准确example.com无法阅读mobile.example.com.
UDPATE
@ffeast问了以下问题:
什么卷曲 - 我的域名归还?有没有Set-Cookie标头?
干得好!
user@host:~$ curl -I https://example.com
HTTP/1.1 200 OK
X-Powered-By: Express
set-cookie: site#lang=en; Path=/;Secure
set-cookie: connect.sid=s%3As46fwOPaosGdwis0G_Wdv7gzUs75Q0rr.O1gLsLmrHmmdBXxPWJrIq8UWwOOaQf96qxUlW%2FxnEuM; Path=/; HttpOnly;Secure
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Content-Type: text/html; charset=utf-8
Content-Length: 19632
ETag: W/"4cb0-bgHMEy79PzLMv7jhB1Lh6A"
Vary: Accept-Encoding
Date: Fri, 16 Mar 2018 20:42:19 GMT
Connection: keep-alive
Set-Cookie: SecureCookie=!zPdIdxiz3mOMe2MYzy1p873u0yWtMdduASsHoU06gkaLs306mhR7cb3ir4TA2EG2cQGKmeVWJeYvxA/flQfPQUixqL8WMOfROsTgu3UZZg==; path=/; Httponly; Secure
Run Code Online (Sandbox Code Playgroud)
我也从浏览器选项卡中看到相同的响应标题.
所以在最初的http响应中有一些set-cookie标头,是的.它们不是我亲自与我的事物范围有任何关系的饼干,但我可以问它们的用途,如果它有所帮助.例:
我注意到domain=没有为它们显式设置一个值..这可能以某种方式为浏览器设置先例,还是我咆哮错误的树?即使它确实如此,我也不认为这example.com只能解释我的cookie会改变它们的价值,也不仅仅发生在第二页加载(而不是第三次+)?不确定你要去哪里,但我全都耳朵!
如果您的目标是在所有子域之间使用 cookie 共享,允许每个人访问和设置 cookie,那么每次设置 cookie 时都需要指定根域。
假设您有sub.example.com、sub2.example.com和example.com,并且您想在它们之间共享 cookie,然后将域设置为example.com。当您未指定域时,cookie 仅是example.com或的属性sub.example.com,但是当您将域指定为 时example.com,则它的所有子域都可以访问它example.com并进行读写。
域= 域(例如,“example.com”或“subdomain.example.com”)。
如果未指定,则默认为当前文档位置的主机部分(但不包括子域)。与早期规范相反,域名中的前导点会被忽略,但浏览器可能会拒绝设置包含此类点的 cookie。如果指定了域,则始终包含子域。
[来源:developer.mozilla.org ]
在 example.com 中:
var value="some value";
document.cookie="myCookie="+escape(value)+"; path=/; domain=example.com";
Run Code Online (Sandbox Code Playgroud)
在 sub.example.com 中:(同上)
var value="some value";
document.cookie="myCookie="+escape(value)+"; path=/; domain=example.com";
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都必须将其设置为example.com。否则可能会出现以下情况
example.com您忘记在某个位置进行设置example.com,则只会创建一个新的 cookie,example.com该 cookie 与共享的 cookie 不同,并且不会与其同步,从而造成很多混乱。sub.example.com您忘记在某个位置进行设置example.com,则只会创建一个新的 cookie,sub.example.com该 cookie 与共享的 cookie 不同,并且不会与其同步,从而造成很多混乱。.example.com因为根据上面的引用,它不被赞赏。cookie重复的可能原因:
domain=example.com设置 cookie.example.com,当第二次请求时,浏览器将 cookie 发送到服务器,服务器端接收新 cookie 的一些代码将其重新设置为example.com。这只能通过检查第二个请求的响应标头来验证。domain=example.com设置 cookie .example.com。当页面加载几秒钟时,任何 JavaScript 代码都会错误地设置它,而没有指定domain=example.com设置 cookie example.com。这只能通过检查涉及设置 cookie 的 JavaScript 代码来验证。我相信意外创建域/子域特定 cookie 是您描述的所有异常的原因。检查设置 cookie 的每个代码部分可能会解决该问题。
更新:这里到底发生了什么。
您正在使用InvocaJS v3.6.6和AngularJS v1.2.19,它们都具有 cookie 管理功能。InvocaJS 将 cookie 中的数据存储为invoca_session并指定了 domain example.com,因此 cookie 设置为.example.com。当 AngularJS 第一次看到 cookie 时没有问题,它会记住它。AngularJS 保留所有 cookie 的副本,当您通过 AngularJS 更新任何 cookie 时,您实际上修改了该副本。之后,AngularJS 循环遍历所有 cookie,将其与副本进行比较,以确定并更新哪些 cookie 已被 AngularJS 更新。
InvocaJS 反复改变 的值invoca_session。当 AngularJS 循环遍历所有 cookie 并且invoca_session与 AngularJS 的值不匹配时,它认为该值已被 AngularJS 更改(如上所述),并更新 的值invoca_session用旧值替换新值。(我测试过,这正是 AngularJS v1.2.19 的工作原理)
问题是 Angular v1.2.19 在设置 cookie 时没有指定任何域(之前预测为 bug 概率 #2)。因此,将创建一个新的 cookie,并将域设置为example.com。之后,当 InvocaJS 尝试读取 cookie 时,它会读取为example.com.
AngularJS 改变 cookie
| 归档时间: |
|
| 查看次数: |
798 次 |
| 最近记录: |