IE iframe cookie問題(p3p)

IE iframe cookie問題(p3p)

前段時間碰到一個問題,就是在IE下,使用iFrame嵌入頁面時,該頁面的會話級別的cookie沒法寫入,致使服務端始終沒法獲取JSESSIONID,每次都是產生一個新的,使得Session沒法使用。php

當時發生問題的時候是自進行CAS登錄框嵌入,現象就是CAS的lt不更新,一開始覺得是iFrame緩存的緣由,通過細心的排查發現並非,而後將想到跨域問題,通過排查發現也不是,甚至懷疑到spring產生lt值得機制存在問題,最終發現是Session沒法正確獲取,每次都會產生新的 Session,通過一番Google,找到解決方案。html

只須要設置 P3P HTTP Header,在隱含 iframe 裏面跨域設置 cookie 就能夠成功。spring

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")服務器

1、關於IE6 IFrame或Frame中讀寫cookie的問題分析cookie

IE6加入了以PlatformforPrivacyPreferences(P3P)爲基礎的 隱私保護功能,有關此功能的說明請參閱「」asp.net

在ie6中Cookie被分紅了first party cookie和third party cookie,即第一方Cookie和第三方Cookie,所謂的第三方Cookie是指在Frame或者Iframe中嵌套頁面的Cookie。dom

當第三方站點試圖讀寫cookie時,IE6就會自動攔截(在狀態欄下顯示紅色禁止圖標)

在IE下是不能在IFrame中設置cookie的,在FF下能夠,在HTTP 標頭加入P3P後,便可解決該問題。

2、P3P

P3P 是萬維網聯盟(W3C)公佈的一項隱私保護推薦標準,旨在爲網上衝浪的Internet用戶提供隱私保護。如今有愈來愈多的網站在消費者訪問時,都 會收集一些用戶信息。制定P3P標準的出發點就是爲了減輕消費者因網站收集我的信息所引起的對於隱私權可能受到侵犯的憂慮。P3P標準的構想是:Web 站點的隱私策略應該告之訪問者該站點所收集的信息類型、信息將提供給哪些人、信息將被保留多少時間及其使用信息的方式,如站點應作諸如 「本網站將監測您所訪問的頁面以提升站點的使用率」或「本網站將盡量爲您提供更合適的廣告」等申明。訪問支持P3P網站的用戶有權查看站點隱私報告,然 後決定是否接受cookie或是否使用該網站。

訪問官方P3P網頁以獲取更多技術信息:http://www.w3.org/P3P

3、相關技術文章

  1. 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
  2. The Platform for Privacy Preferences 1.0 Deployment Guide
  3. Make Your Web Site P3P Compliant
    此文經過6個簡單的步驟介紹如何在網站上實施P3P策略。

4、「官方」的解決方法

看完了第三節的文章你會發現,所謂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來編寫這個文件。

三種部署方式:

  1. Well-Know location
    /w3c/p3p.xml
    將P3P Reference File檔案改名爲p3p.xml,並放置在/w3c目錄當中
  2. 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"");
  3. 在HTML內容中嵌入Link標籤
    <link rel="P3Pv1" href="/w3c/p3p.xml"></link>
     
     
     



相關文章
相關標籤/搜索