最近在做一個流量統計的東西的時候,偶然發現IE在對iframe里面的頁面寫Cookie的時候有一些安全限制,導致讀取Cookie不成功,找了好長時間的解決辦法,重要找到如下的辦法:
1.頁面里的COOKIE不能是瀏覽器進程的COOKIE(包括驗證票和不設置超時時間的COOKIE),否則跨域會取不到.這點做跨域COOKIE的人比較少提到.不過實際上留意下幾家大學做的方案,有細微的提到他們的驗證模塊里的COOKIE是有設置超時時間的.
2.當利用IFRAME時,記得要在相應的動態頁的頁頭添加一下P3P的信息,否則IE會自覺的把IFRAME框里的COOKIE給阻止掉,產生問題.本身不保存自然就取不到了.這個其實是FRAMESET和COOKIE的問題,用FRAME或者IFRAME都會遇到.
3.測試時輸出TRACE,會減少很多測試的工作量.
只需要設置 P3P HTTP Header,在隱含 iframe 里面跨域設置 cookie 就可以成功。他們所用的內容是:
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的話,應該是如下寫法:
header('P3P: CP=CAO PSA OUR');
ASP.NET的話
通過在代碼上加Response.AddHeader("P3P", "CP=CAO PSA OUR")或者在Window服務中將ASP.NET State Service 啟動。
JSP:
response.setHeader("P3P","CP=CAO PSA OUR")
You can add a P3P compact policy header to your child content, and you can declare that no malicious actions are performed with the data of the user. If Internet Explorer detects a satisfactory policy, then Internet Explorer permits the cookie to be set.
Visit the following MSDN Web site for a complete list of satisfactory and unsatisfactory policy codes:
Privacy in Internet Explorer 6
http://msdn.microsoft.com/workshop/security/privacy/overview/privacyie6.asp (http://msdn.microsoft.com/workshop/security/privacy/overview/privacyie6.asp)
A simple compact policy that fulfills this criteria follows:
This code sample shows that your site provides you access to your own contact information (CAO), that any analyzed data is only "pseudo-analyzed", which means that the data is connected to your online persona and not to your physical identity (PSA), and that your data is not supplied to any outside agencies for those agencies to use (OUR).
You can set this header if you use the Response.AddHeader method in an ASP page. In ASP.NET, you can use the Response.AppendHeader method. You can use the IIS Management Snap-In (inetmgr) to add to a static file.
Follow these steps to add this header to a static file:
- Click Start, click Run, and then type inetmgr.
- In the left navigation page, click the appropriate file or directory in your Web site to which you want to add the header, right-click the file, and then click Properties.
- Click the HTTP Headers tab.
- In the Custom HTTP Headers group box, click Add.
- Type P3P for the header name, and then for the compact policy string, type CP=..., where "..." is the appropriate code for your compact policy.
Alternatively, Internet Explorer users can modify their privacy settings so that they are prompted to accept third party content. The following steps show how to modify the privacy settings:
- Run Internet Explorer.
- Click Tools, and then click Internet Options.
- Click the Privacy tab, and then click Advanced.
- Click to select the Override automatic cookie handling check box.
- To allow ASP and ASP.NET session cookies to be set, click to select the Always allow session cookies check box.
- To receive a prompt for any type of third party cookie, click Prompt in the Third-party Cookies list.
關于IE6 IFrame或Frame中讀寫cookie的問題分析
一、起因
信通寶在客戶網站上浮動窗口的實現是通過在客戶的網站上加上一段鏈接腳本,腳本在客戶網站上寫入一IFrame,此Iframe中的內容src=""是指向信通寶網站,如src="www.xtb.com/script.js"。 信通寶的功能需求中有一項是要求記錄用戶訪問此網站的次數的,這就要求必須在訪客的電腦中保存cookie才能實現。但是在IE6中,Frame和 IFrame中無法按常規方法來讀寫cookies。因為IE6加入了以PlatformforPrivacyPreferences(P3P)為基礎的 隱私保護功能,有關此功能的說明請參閱“微軟公布IE6新增隱私保護功能的詳情”
文章出處:http://hi.baidu.com/wuchangx
email:wuchang@guet.edu.cn
IE6中的隱私保護設置:
在“工具”菜單下選擇“Internet選項”。點擊“隱私”標簽。IE 6的缺省隱私等級設置為“中”——即“阻止沒有合同隱私策略的第三方cookie;阻止使用個人可標識信息而沒有您的隱含許可的第三方cookie;限制使用個人可標識信息而沒有隱含許可的第一方cookie”。見下圖:
在ie6中Cookie被分成了first party cookie和third party cookie,即第一方Cookie和第三方Cookie,所謂的第三方Cookie是指在Frame或者Iframe中嵌套頁面的Cookie。舉例來 說,ABC公司購買了我們的信通寶產品,并在其公司網站http://www.abc.com/上加上了信通寶的鏈接腳本(www.xtb.com/test.js),這個腳本在abc公司的網站上加上一個IFrame,此Iframe的內容為xtb.com上的某個頁面如(www.xtb.com/List.aspx?cid=1234),而這個List.aspx頁面需要在讀寫cookie以便記錄訪客的次數等信息。當訪客在訪問ABC公司的網站時,http://www.abc.com/即為第一方站點,信通寶視為第三方站點,當List.aspx試圖讀寫cookie時,IE6就會自動攔截(在狀態欄下顯示紅色禁止圖標),可以通過查看得到類似如下圖的隱私報告:
以下是凌風現在使用的解決方法:
----------------------------------------------------
凌風(33446***) 09:28:58
信通寶代碼在平臺中可用部分之一:
//添加P3P到HTTP頭輸出流,用于解決IFrame下不能設置cookie的問題
Response.AddHeader("P3P", "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");
凌風(3344***) 09:31:16
在IE下是不能在IFrame中設置cookie的,在FF下可以,但將以上代碼拷貝到Page_Load中,即可解決該問題。
---------------------------------------
此方法應用在信通寶第2版中,并通過測試。
二、P3P
什么是P3P?
P3P是萬維網聯盟(W3C)公布的一項隱私保護推薦標準,旨在為網上沖浪的Internet用戶提供隱私保護。現在有越來越多的網站在消費者訪問時,都 會收集一些用戶信息。制定P3P標準的出發點就是為了減輕消費者因網站收集個人信息所引發的對于隱私權可能受到侵犯的憂慮。P3P標準的構想是:Web 站點的隱私策略應該告之訪問者該站點所收集的信息類型、信息將提供給哪些人、信息將被保留多少時間及其使用信息的方式,如站點應做諸如 “本網站將監測您所訪問的頁面以提高站點的使用率”或“本網站將盡可能為您提供更合適的廣告”等申明。訪問支持P3P網站的用戶有權查看站點隱私報告,然 后決定是否接受cookie或是否使用該網站。
訪問官方P3P網頁以獲取更多技術信息:http://www.w3.org/P3P。
三、相關技術文章
- Help! IE6 Is Blocking My Cookies[1],[2]
a).What is P3P?
b).Why Does IE6 Block My Cookies?
c).What are Third-Party Cookies?
e).How Can I Prevent IE6 from Blocking My Cookies?
f).How Do I P3P Enable My Web Site and Use Compact Policies?
g).I P3P-Enabled My Site, But My Cookies are Still Being Blocked by IE6
h).My Cookies aren't being Blocked, But Users are Not Able to View an i).IE6 Privacy Report for My Site
- The Platform for Privacy Preferences 1.0 Deployment Guide
- Make Your Web Site P3P Compliant
此文通過6個簡單的步驟介紹如何在網站上實施P3P策略。
四、“官方”的解決方法
看完了第三節的文章你會發現,所謂P3P策略實際就是一個部署在Web服務器上的簡單XML文件,指明網站打算使用哪些cookie以及派什么用途。這個XML文件類似這種格式
<META xmlns="http://www.w3.org/2000/12/P3Pv1">
<POLICY-REFERENCES>
<POLICY-REF about="/P3P/Policy1.xml">
<COOKIE-INCLUDE
name="*"
value="*"
domain="*"
path="*"/>
</POLICY-REF>
</POLICY-REFERENCES>
</META>
可以使用IBM的P3P策略編輯器IBM's P3P Policy Editor來編寫這個文件。
三種部署方式:
- Well-Know location
/w3c/p3p.xml
將P3P Reference File檔案更名為p3p.xml,并放置在/w3c目錄當中
- HTTP 頭
P3P:policyref="http://www.mysite.com/w3c/p3p.xml" CP="ALL DSP COR NID CUR OUR IND PUR"
CP是由3字符代碼組成的列表(相關信息已經在W3C網站上進行了說明)。在上例中,該網站不定期地(INDefinite)為OUR公司收集購買商品項 目(PURchasing)或完成當前活動(CURrent)的有關數據。有疑問(DiSPutes)、不可識別(Nonidentifiable)的數 據作為cookie存儲(NID)。由于我們的網站以cookie的方式存儲客戶號,所以NID應該從列表中刪除。
CP應該匹配完整的策略;因此,如果你在CP中使用了NID,那么你應該在你的策略文件中包括<nonident/>標簽。為了匹配這些設置 而在下一節介紹的校驗工具會對以上代碼進行檢查,如果有差異的話,Internet Explorer 6.0瀏覽器也會檢查策略文件并且令策略文件無效
如果是asp/asp.net/jsp/php等動態頁面,也可以添加類似以下代碼:
response.setHeader("P3P","policyref="http://www.mysite.com/w3c/p3p.xml" CP="ALL DSP COR CUR OUR IND PUR"");
- 在HTML內容中嵌入Link標簽
<link rel="P3Pv1" href="/w3c/p3p.xml"></link>