瀏覽器的第三方 cookie 限制
所謂第三方 cookie,就是說你訪問網頁 A,卻接收到域名 B 的 cookie 設定指令。這可能是由於網頁 A 請求或鏈接了 B 的網頁,比如上面提到的 iframe 以及 jsonp。
我查到了各個瀏覽器對於跨域的處理規則,可以看到第三方 cookie ,IE 在默認設置中是做了限制的。
IE | FireFox | Chrome | Safari | Opera | |
限制第三方coookie | 是 | 否 | 否 | 是 | 否 |
用戶訪問的流程是這樣的:
1.用戶先在A處登錄,A設自己的cookie,在A的菜單里有去B應用的鏈接
2.當用戶點去B應用的鏈接時,A在鏈接上自動加上這個用戶的token,傳給B系統
3.當B系統接收到請求后,把這個用戶的token信息設成自己系統的cookie,(B系統里有表單post操作,如果不設cookie,session,那么每個請求不管GET還是POST都要明確帶着該用戶的token信息,對於系統的改造量比較大,另外以后換權限驗證方法改動也比較大。)
4.用戶在B系統里的每次操作都沒有明碼帶用戶的token,所以每次都要去cookie得到token信息,然后發送一個http請求去A,讓A系統驗證這個用戶是否有權限訪問。
5.如果A系統的接口返回可以訪問的狀態報告,那么B繼續執行;如果A系統指示沒有權限訪問,那么B系統提示訪問受控警告信息。
IE不允許跨域訪問cookie(好象firefox沒問題,ie自6.0以后改用w3c組織的P3P協議了),再看看我的應用,在第二步設的cookie,在第三步以后所有B應用的訪問請求,ie都把B應用的cookie blocked掉了(因為用戶的訪問是從A應用發起,從A應用訪問B應用,算跨域訪問,IE認為有安全問題)。。。。(IE狀態欄有一個紅眼睛的button,點開可以看到哪些cookie給blocked掉了)
P3P?
P3P 全稱 Platform for Privacy Preferences,隱私設定平台規范。這個規范極其復雜,若要講清楚,天都黑了一半。簡言之,就是網站向瀏覽器聲明自己的隱私政策,比如網站是否搜集訪問者的個人信息,設置 cookie 的用途等等。瀏覽器會依據設置,決定在第三方請求的條件下是否接受網站的 cookie。
完整地部署 P3P 包括設立隱私政策文件(policy.html)、原則檔(policy.xml)、參考檔(p3p.xml),有興趣詳細了解的可以參考 MSDN 中關於部署 P3P 的文章。
部署方法比較簡單的方法的,就是發送 P3P 相關的 HTTP header。
ASP.NET:
1 HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
PHP:
1 header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
Java:
1 response.setHeader("P3P","CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'");
其中CP=“XXX XXXX”這些是有具體含義的:
CP就是 compact policies 的意思,
另外header的值也可以是 policyref="http://myhost/P3P/PolicyReferences.xml" ,就是指定一個策略文件。
具體請看這里.
下面是摘抄的一段Compact Policies的具體取值范圍和設值含義。
Compact Policies
Compact policies are essentially summaries of P3P policies. They can be used by user agents to quickly get approximate information about P3P policies, therefore improving performance.
For an in-depth explanation of compact policies, we refer to the P3P1.0[4] specification. Here, we limit to stating the syntax:
compact-policy-field = `CP="` compact-policy `"` compact-policy = compact-token *(" " compact-token) compact-token = compact-access | compact-disputes | compact-remedies | compact-non-identifiable | compact-purpose | compact-recipient | compact-retention | compact-categories | compact-test compact-access = "NOI" | "ALL" | "CAO" | "IDC" | "OTI" | "NON" compact-disputes = "DSP" compact-remedies = "COR" | "MON" | "LAW" compact-non-identifiable = "NID" compact-purpose = "CUR" | "ADM" [creq] | "DEV" [creq] | "TAI" [creq] | "PSA" [creq] | "PSD" [creq] | "IVA" [creq] | "IVD" [creq] | "CON" [creq] | "HIS" [creq] | "TEL" [creq] | "OTP" [creq] creq = "a" | "i" | "o" compact-recipient = "OUR" | "DEL" [creq] | "SAM" [creq] | "UNR" [creq] | "PUB" [creq] | "OTR" [creq] compact-retention = "NOR" | "STP" | "LEG" | "BUS" | "IND" compact-category = "PHY" | "ONL" | "UNI" | "PUR" | "FIN" | "COM" | "NAV" | "INT" | "DEM" | "CNT" | "STA" | "POL" | "HEA" | "PRE" | "LOC" | "GOV" | "OTC" compact-test = "TST"
另外這里還有一個P3P的驗證工具:http://www.w3.org/P3P/validator.html,可以驗證一下自己設置的P3P是否正確。
參考:
使用 P3P 規范讓 IE 跨域接受第三方 cookie
用P3P header解決iframe跨域訪問cookie
The HTTP header for the Platform for Privacy Preferences 1.0 (P3P1.0)