找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2079|回复: 9

phpcookie跨域

  [复制链接]
发表于 2011-10-10 08:25:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
cookie的一些测试
概要:主要介绍了cookie的基本信息,和一些在开发过程中遇到的问题,此文以php为测试语言,以firefox为测试工具


测试用到的工具firebug,firecookie,
这个容易,google下安装把

--------------------------------------------------------------------------------
w3c的相关说明
清单1.cookie格式

set-cookie = "Set-Cookie:" cookies
cookies = 1#cookie
cookie = NAME "=" VALUE *(";" cookie-av)
NAME = attr
VALUE = value
cookie-av = "Comment" "=" value
| "Domain" "=" value
| "Max-Age" "=" value
| "Path" "=" value
| "Secure"
| "Version" "=" 1*DIGIT
这个介绍可能不大理解,以下是响应头中的set-cookie样例(可以通过:firebug->网络->展开带+号图标 里面即有此格式)
Set-Cookie: name=aa; path=/a/; domain=.leju.com name1=aa; path=/; domain=.leju.com name2=cccc; path=/; domain=.leju.com
样例中存在三个值对 name,name1,name2
域匹配规则:
1.如果domain=*,*这个值为ip,那么只有请求的域也为此ip才能读写
2.如果domain=*,*这个值为a.com类型,则请求的域只有为a.com才能读取,类似x.a.com域,是不能读取的
3.如果domain=*,*这个值为.a.com类型,则请求到域只要结尾是a.com都能读写,比如y.x.a.com a.com
max-age
(过期时间,为gmt格式,php以秒为单位,setcookie函数会自动转换):
0:表示只在当前会话有效,当前窗口关闭即过时
过去时间:设置忽略
将来时间:在这个时间点之前有效
有待研究:
Secure

--------------------------------------------------------------------------------
php setcookie,setrawcookie函数使用
示例:setcookie(‘name1′,’value1中文’,0,’/',’.leju.com’) 以leju.com结尾的域,都能够访问这个临时会话,窗口关闭,即过期
setcookie会自动对进行urlencode,如果不需要自动转化的话,使用setrawcookie,他得使用方法和setcookie是一样的

cookie的写入顺序
客户端cookie-》拼入请求头-》php端进行读写cookie操作->拼入响应头->客户端读取
简要的说下这个流程,是为了解释一下我在编程的说话遇到的情况,当我在服务器端用setcookie();放置一个有效的cookie值,在接下来的代码里,我想通过$_COOKIE来读取,没有读取到,这是因为
我现在设置的cookie值,实际上还不能称之为cookie,因为他还没有存入客户端,所以,只有在下次连接,才能通过$_COOKIE读取

--------------------------------------------------------------------------------
firefox下的一些测试结果
firefox 针对某个域,能容纳cookie的最大数目 50
这个可以写段代码测试下,w3c下说的是至少20个,我在firefox下测试,实际最多能存50个
针对一个值对,firefox最多容纳4092个字符,超出的话,这个值对就无法写入了
例如,现在我设置一个name=*的值对,*的字符长度不能超过4092,当然这个值对可能不是很准确,只是仅供参考,在估计有可能存放过长字符的说话,我们应该手动测试下,确保安全,如果超过长度,setcookie是无效得,如果原来已有这个值对了,对此不产生影响。
cookie能容纳到编码
规范上说存放的是ascii字符集代码,所以其他字符集最好是自己处理下,在php中,如果直接在setcookie中文,他会自动用urlencode转换,我一般做法是在secookiet前,用rawurlencode处理下,在读取的时候,用rawurldecode解下就行。
跨域写cookie
ie浏览器在默认设置下(firefox是可以跨域写cookie的),是不允许跨域写cookie的,例如:www.a.com www.b.com,在a域下是无法直接写b域下的cookie值(ie和firefox)。但是我们可以通过间接的方式写。

--------------------------------------------------------------------------------
php实现跨域写cookie
测试环境搭建
在实现之前,需要配置好测试环境,即在本地配置出a.com,b.com,我这就假设已经配置好.以下是代码清单
清单2.测试环境文件列表

www.a.com
cookieform.html//iframe表单
getcookie.php//读取a.com cookie
index_frame.php//frame提交方式
index.php//演示入口,script标签方式
proxy.php//iframe往b.com写完域名后,由b.com跳回的代
setcookie.php/设置a.com域名
www.b.com
getcookie.php//获取b.com cookie
setcookie.php//设置b.com cookie

方式一.通过js生成一个script标签,用它(.src=”*”)去加载b.com域程序中写cookie的代码
有人说这是jsonp方式,没验证.
清单3.服务器端代码:

<?php
sleep(2);//推迟2秒,验证采用script方式设置cookie时不等待php运行完成,就进行跳转,是不能成功设置的
$domain = strval($_REQUEST['domain']);
//p3p协议在firefox3.6下是不需要设置也能跨域写cookie的
if($_GET['act'])
{
         header('P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"');
}
if($_REQUEST['act']=='frame')//采用iframe方式提交写cookie
{
         setcookie('bcom',$_GET['cookievalue'],0,'/',$domain);
         $str = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body><script>parent.framecallback(1);</script></body></html>';
         header('location:http://www.a.com/proxy.php?back='.urlencode($str));
}else{//采用js方式写cookie
         setcookie('bcom',$_GET['cookievalue'],0,'/',$domain);
         echo 'callback(1)';
}
?>
说明:用来写cookie,通过act来辨别是iframe方式提交还是script标签的方式写cookie,域和cookie值由domain和cookievalue值决定,这里还有一个p3p协议,有兴趣的可以看下,p3p(Platform for Privacy Preferences 参考地址:http://www.w3.org/TR/P3P/)协议:http://www.w3.org/P3P/details.html
清单4.客户端代码:

<script>
// 此函数用来执行一个script
function excuteScript (id, scriptSource, charset) {
                 var head = document.getElementsByTagName('head')[0];
                 var oldScript = document.getElementById(id);
                 if (oldScript) {
                         head.removeChild(oldScript);
                 }
                 var newScript = document.createElement('script');
                 if (charset) {
                         newScript.charset = charset;
                 } else {
                         newScript.charset = 'utf-8';
                 }
                 newScript.id = id;
                 newScript.type = 'text/javascript';
                 newScript.src = scriptSource;
                 head.appendChild(newScript);
                 //location.href='index.php?act=noset';//测试不等待b.com下setcookie.php执行完成,直接跳转的情况
};
</script>
作用就是生成一个script节点,加载指定的src地址,而这个src地址就是我们需要调用的http://www.b.com/setcookie.php?act=1&domain=.b.com&cookievalue=helloworld(参数说明:act用来辨别是通过script标签还是iframe标签,cookievalue 需要写的cookie值,domain 需要写cookie的域)
打开http://www.a.com/index.php ,点击js方式写cookie,如果一切正常,会提示你cookie设置成功,在下面有一个获取 b.com cookie按钮,如果有值的话,就说明cookie设置成功了。
方式二.通过在iframe中生成一个form表单,提交到b域程序中写cookie的地址,再由b域返回到a域的一个代理
在index.php中,放置如下代码:
清单5.提交iframe中的表单函数

function excuteFrame(domain){
         document.all.myFrame.contentWindow.document.getElementById('myform').action = 'http://www'+domain+"/setcookie.php";
         document.all.myFrame.contentWindow.document.getElementById('domain').value = domain;
         document.all.myFrame.contentWindow.document.getElementById('myform').submit();
}
function framecallback(flag)
{
         if(flag==1)
         {
                 alert('设置成功');
         }
}
清单6.iframe 代码

<iframe src='cookieform.html' id="myFrame" name="myFrame" width="200" height="200"></iframe>
iframe表单:
<html>
<body>
<form id="myform" action="http://www.a.com/setcookie.php">
cookie:<input type="text" name="cookievalue" value="iframe helloword"/>
<input type="hidden" name="act" value="frame"/>
设置域:<input type="text" id="domain" name="domain" value=".a.com"/>
</form>
</body>
</html>
方式三.使用ajax方式来跨域读取(看下$.getJSON的用法,然后访问b域程序中写cookie的地址)
方式四.用flash做一个代理,由flash向b.com发出 写cookie请求(这个网上有相关资料,google下吧)
--------------------------------------------------------------------------------
php实现跨域读cookie
读cooki和写cookie同样可以用以上方法
方式一.通过生成一个head标签加载b.com域程序
方式二.通过在iframe中生成一个form表单,提交到b域,再有b域返回到a域
方式三.使用ajax方式来跨域读取(看下$.getJSON的用法,然后访问b域程序中写cookie的地址)
方式四.用flash做一个代理,由flash向b.com发出 写cookie请求(这个网上有相关资料,google下吧)
--------------------------------------------------------------------------------
发表于 2011-10-11 13:26:17 | 显示全部楼层
发表于 2011-10-18 03:36:52 | 显示全部楼层
希望大家发表自己的看法!我先赞成一下












    智通财务咨询有限公司http://www.zshuipiao.com/ **杭州**.QQ:82500437
发表于 2011-10-18 21:46:14 | 显示全部楼层
非常感谢您!













发表于 2012-1-12 11:03:27 | 显示全部楼层
总有一种人因为自卑,自闭孤独的生活着,自卑不仅仅是缘于别人的眼神与话语,而是更多的源于自己内心的软弱与放弃,将自己封闭在自卑的世界里。自卑的人完全可以走出来广州白癜风I,每个人的价值并不在于拥有金钱的多与少,而是一种发自内心的快乐,不要放弃脸上的微笑,永远不要放弃快乐,以及对生活的热爱。对生活要有一种积极向上的态度。只要活着,我们就要更好地生活!

发表于 2014-3-4 15:57:42 | 显示全部楼层
  看看再说

  health.people.com.cn/jbk/ 疾病库












<a href="health.people.com.cn/jbk/dianxian/">癫痫的最新治疗方法</a>
发表于 2014-3-21 04:12:14 | 显示全部楼层
我也想了解,请大家都说说












30V电源适配器生产厂家
发表于 2014-3-30 12:42:51 | 显示全部楼层
共同发展!学习才会进步,谢了












电子数显橡胶比重计
发表于 2014-6-26 20:09:03 | 显示全部楼层
回帖是必须的,这个可以有!












hgwzn579.com
发表于 2014-7-1 07:03:51 | 显示全部楼层
超級精彩,我非常喜歡













        澳大利亚SAA澳规5V6A开关电源适配器
               


       
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部快速回复上一主题下一主题返回列表找客服手机访问
快速回复 返回顶部 返回列表