JavaScript-PHP SETCOOKIE 诡异问题
之前在工作中遇到的问题,至今不明白,来问问。
我在www.xx.cn 域下给 .xx.cn 父域写cookie 一直失败,无法在 xxx.xx.cn 下读出
但是如果 "xx.cn" 的长度增加一位则可以
如:
www.xxx.cn 给 .xxx.cn 域下写ok
这个是什么原因,还是说w3c有特殊约定?
描述失败。。
之前 FF 版本底的时候
http://user.qjp.jj.cn/cc.php 访问这个文件一直没cookie
目前 有了
IE 6 依然没
<?php
print_r($_COOKIE);
setcookie('bac','aaa',time()+13600,'/','.jj.cn',0);
?>
~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
该问题其实就是微软对IE浏览器做的限制:
微软官方解答:Internet Explorer does not set a cookie for two-letter domains
IE浏览器的cookie问题(Q6):http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx
跨域cookie的详细讲解:http://www.phpweblog.net/linxiaobo/archive/2009/04/15/6419.html
对于cookie domain,
".xx.cn"只能在二级域名以及"www.xx.cn"下有效
"xx.cn"则可以在xx.cn主域名之下的多级子域名有效
所以去掉.xx.cn中最前面的那个.
参考:PERSISTENT CLIENT STATE HTTP COOKIES
Only hosts within the specified domain can set a cookie for a domain and domains must have at least two (2) or three (3) periods in them to prevent domains of the form: ".com", ".edu", and "va.us". Any domain that fails within one of the seven special top level domains listed below only require two periods. Any other domain requires at least three. The seven special top level domains are: "COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT".
用以下方式解决IE的问题:ie6/chrome/firefox下测试通过
1.p3p
2.setcookie的时候不要写domain
<?php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
print_r($_COOKIE);
setcookie('bac','aaa',time()+13600,'/','',0);
?>
还有个原因是因为IE内核限制了iframe方式的cookie传递,防止XSS(跨站)攻击的。
因为我们可以在没有做特殊字符过滤的表单中填入<iframe src=http://我们的空间/xss.htm>,而xss.htm代码中写入获得Cookie的代码。这样Cookie就被盗取了。
所以微软给IE内核做限制了,但session是可以通过iframe方式传递的。
我也碰到这个问题了,老实说我没有解决他
用了另外一个方式绕过去了
改用php输出js,用js写cookie