西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)javascript|JQuery → iframe 中 js 的 cookie 讀寫不到的解決辦法

iframe 中 js 的 cookie 讀寫不到的解決辦法

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2012/8/27 13:30:28字體大小:A-A+

作者:西西點擊:475次評論:0次標簽: iframe

華碩MultiFrame軟件v1.0.22 官方安裝版
  • 類型:系統(tǒng)其它大。3.0M語言:中文 評分:5.0
  • 標簽:
立即下載

先看一個例子比如:我們在 www.innovatechautomation.com 中用 iframe 了一個 www.fxxz.com 的一個頁面。

如:

< iframe height="100" marginheight="0" src="http://www.fxxz.com/" frameborder="0" width="970" marginwidth="0" scrolling="no" bordercolor="#000000">< /iframe>

 

在IE下面 www.fxxz.com 這個被框住的頁面是無法進行COOKIE的讀寫的。

用 document.cookie; 是讀取不到 Cookie值的。

cookie的作用域又是如何界定的呢?

我在一個文件夾下,比如 d: mp\ 下建了幾個html文件,我發(fā)現(xiàn)在a.htm中創(chuàng)建的cookie,在b.htm中是可以識別的。
是不是可以認為,只要是同一個文件夾下的html文件,就可以共享cookie,
當然,我是在本機上做測試,如果作為一個網(wǎng)站來講,cookie的作用域又是如何界定的呢?


document.cookie = "username=" + escape(value)+ "; xpires ="+ expiration.toGMTString()+";path=/;domain=localhost; secure";

就是說.當你PATH設(shè)置成/時.你當前文件夾或者DOMAIN下的所有子文件及子文件夾里的文件都可以讀到.但當設(shè)置為/thispathname就只有DOMAIN/thispathname下的文件及文件夾能讀寫。

其根源也是由于iframe跨站點cookie被阻導(dǎo)致session失效。但是當時因為兩個站點都是自有的服務(wù)器,因此通過設(shè)置了相同的父域名解決了此問題,所以后來也就沒有深入研究此問題。

    目前在開發(fā)新功能時,又一次遇到了此問題,但是如果仍舊通過更改域名的方式來解決的話,設(shè)計上可能就會非常麻煩。于是不得已徹底翻了一下資料,初步研究結(jié)果如下:

問題根源:

    IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)協(xié)議默認阻止第三方無隱私安全聲明的cookie,F(xiàn)irefox目前還不支持P3P安全特性,firefox中自然也不存在此問題了。Mircosoft對此的具體描述可以參見 Privacy in Internet Explorer 6

解決方法:

很簡單,在要嵌入的內(nèi)容中(iframe指向的站點)輸出P3P的主機頭聲明,步驟如下 (Session variables are lost if you use FRAMESET in Internet Explorer 6):

1.打開IIS管理器 inetmgr
2.選擇被嵌入iframe源站點或者目錄,右鍵點擊打開屬性框
3.切換到HTTP頭
4.添加


5.自定義HTTP頭名: P3P
6.自定義HTTP頭值: CP="CAO PSA OUR"


7.關(guān)閉屬性框退出,即刻生效

 

我們可以查一下 HTTP 頭信息

http://tool.chinaz.com/pagestatus/

用這里可以查看一下剛剛的設(shè)置:



至于上面CAO PSA OUR的具體意思,還是請參考前面的文章:Privacy in Internet Explorer 6

 

如果是動態(tài)語言可以用下面的添加頭信息的辦法來解決:

PHP

<?php
header('P3P: CP="CAO PSA OUR"');//ADD IN THIS LINE IN ORDER TO SOLVE THE INTERNET EXPLORER ALWAYS GET NEW SESSION ISSUEsession_start();$_SESSION['test']='anything';echo$_SESSION['test'];

?>




關(guān)于“用P3P header解決iframe跨域訪問cookie/session”的問題


理論很簡單,而且模式也和大多請求返回狀態(tài)的SSO差不多.但是有幾個地方是要注意一下的.
1.頁面里的COOKIE不能是瀏覽器進程的COOKIE(包括驗證票和不設(shè)置超時時間的COOKIE),否則跨域會取不到.這點做跨域COOKIE的人比較少提到.不過實際上留意下幾家大學(xué)做的方案,有細微的提到他們的驗證模塊里的COOKIE是有設(shè)置超時時間的.
2.當利用IFRAME時,記得要在相應(yīng)的動態(tài)頁的頁頭添加一下P3P的信息,否則IE會自覺的把IFRAME框里的COOKIE給阻止掉,產(chǎn)生問題.本身不保存自然就取不到了.這個其實是FRAMESET和COOKIE的問題,用FRAME或者IFRAME都會遇到.
3.測試時輸出TRACE,會減少很多測試的工作量.
只需要設(shè)置 P3P HTTP Header,在隱含 iframe 里面跨域設(shè)置 cookie 就可以成功。他們所用的內(nèi)容是:
P3P: CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'

ASP直接在頭部加了頭部申明,測試有效

<%Response.AddHeader "P3P", "CP=CAO PSA OUR"%>
php的話,我沒去試,應(yīng)該是如下寫法:
header('P3P: CP=CAO PSA OUR');


ASP.NET的話

通過在代碼上加Response.AddHeader("P3P", "CP=CAO PSA OUR") 或者在Window服務(wù)中將ASP.NET State Service 啟動。

JSP:
response.setHeader("P3P","CP=CAO PSA OUR") 




 

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    第 1 樓 湖北鄂州聯(lián)通 網(wǎng)友 客人 發(fā)表于: 2012/8/27 13:55:26
    IE瀏覽下在使用下劃線"_"作域名的網(wǎng)站,也是獲取不到cookie,建議使用橫扛"-"替換下劃線"_"。 這個問題浪費了我很多很多的時間呀!!

    支持( 0 ) 蓋樓(回復(fù))

    最新評論

    第 1 樓 湖北鄂州聯(lián)通 網(wǎng)友 客人 發(fā)表于: 2012/8/27 13:55:26
    IE瀏覽下在使用下劃線"_"作域名的網(wǎng)站,也是獲取不到cookie,建議使用橫扛"-"替換下劃線"_"。 這個問題浪費了我很多很多的時間呀。

    支持( 0 ) 蓋樓(回復(fù))

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)