萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> cookie與session跨域登陸代碼(ie6,ie7,firefox)

cookie與session跨域登陸代碼(ie6,ie7,firefox)

frameset裡面,也就是裡面的frame是來自第三方站點(不同ip或不同域名),那麼默認情況下ie會自動禁用這些站點的cookie,也就是在請求某url時在http header裡不發送它們的cookie,包括session的cookie。注意,這些站點在response裡面設置的cookie還是會被發送到浏覽器的。

但象ie 6.0和ie 7.0有個自己的標准.要支持p3p,ie 6的缺省隱私等級設置為"中"——即"阻止沒有合同隱私策略的第三方cookie"。而在用戶浏覽a.php教程時 a.com寫入的為第一方cookie,其嵌入的iframe指向b.php.這時b.com寫入的就為第三方cookie了,所以它是被ie當在了大門外。

所以,每次當用戶提交的cookie提交時,就掛掉了.因為傳不到真實的服務器.

好了,不多講了,直接講解決方案.

php的程序

可以直接在b網站中寫入
<?php
header('p3p: cp="cura adma deva ps教程ao psdo our bus uni pur int dem sta pre com nav otc noi dsp cor"')
?>
這樣就能接受第三方的cookie啦。

lighttpd的服務器

server.modules    = ("mod_setenv")

setenv.add-response-header = ( "p3p" => "cp='cura adma deva psao psdo our bus uni pur int dem sta pre com nav otc noi dsp cor'")

apache的服務器

<virtualhost>

header set p3p 'cp="cura adma deva psao psdo our bus uni pur int dem sta pre com nav otc noi dsp cor"'

</virtualhost>

iis的服務器
增加一個網站http頭來解決問題;
管理工具——〉選擇一個網站——〉屬性——〉http頭,增加一個http頭
然後輸入頭名:p3p
輸入頭內容:cp=cao psa our

如果要登陸就如下設置

setcookie('auth_member_string', 0, time()+3600,'/',$cfg['domain']);
 setcookie('auth_member_name',0,time()+3600,'/',$cfg['domain']);
 setcookie('auth_member_realname',0,time()+3600,'/',$cfg['domain']);

登出

setcookie('auth_member_string', 0, time()-1,'/',$cfg['domain']);
 setcookie('auth_member_name',0,time()-1,'/',$cfg['domain']);
 setcookie('auth_member_realname',0,time()-1,'/',$cfg['domain']);

下面來看一個測試實例

我只寫一個大概,為了測試的方便,先編輯hosts文件,加入測試域名(c:windowssystem32driversetchosts)

127.0.0.1        www.a.com
127.0.0.1        www.b.com

首先:創建 a_setcookie.php 文件,內容如下:

<?php
//header('p3p: cp="cura adma deva psao psdo our bus uni pur int dem sta pre com nav otc noi dsp cor"');

setcookie("test", $_get['id'], time()+3600, "/", ".a.com");
?>

然後:創建 a_getcookie.php 文件,內容如下:

<?php
var_dump($_cookie);
?>

最後:創建 b_setcookie.php 文件,內容如下:

<script src="http://www.a.com/a_setcookie.php?id=www.b.com"></script>

----------------------------

三個文件創建完畢後,我們通過浏覽器依次訪問:

http://www.b.com/b_setcookie.php
http://www.a.com/a_getcookie.php

我們會發現,在訪問b.com域的時候,我們並沒有在a.com域設置上cookie值。

然後我們修改一下a_setcookie.php文件,去掉注釋符號,a_setcookie.php即為:

<?php 
header('p3p: cp="cura adma deva psao psdo our bus uni pur int dem sta pre com nav otc noi dsp cor"'); 

setcookie("test", $_get['id'], time()+3600, "/", ".a.com"); 
?>

再次通過浏覽器依次訪問:

http://www.b.com/b_setcookie.php
http://www.a.com/a_getcookie.php

這次,你會發現在訪問b.com域的時候,我們設置了a.com域的cookie值。

末了補充一句,似乎只有ie對跨域訪問cookie限制比較嚴格,上述代碼在firefox下測試,即使不發送p3p頭信息,也能成功

copyright © 萬盛學電腦網 all rights reserved