IE下IFrame引用跨域站點頁面時,Session失效問題解決

問題場景:
在一個應用(集團門戶)的某個page中, 經過IFrame的方式嵌入另外一個應用(集團實時監管系統)的某個頁面. 當兩個應用的domain 不同時, 在被嵌入的頁面中Session失效。(session基於cookie實現,引用頁不容許使用cookie).

問題分析:
IE6/IE7從安全性角度考慮,支持的P3P(Platform for Privacy Preferences Project (P3P) specification)協議默認阻止第三方無隱私安全聲明的cookie,Firefox目前還不支持P3P安全特性,firefox中天然也不存在此問題了。

解決方案:
1. 修改Client的設置
使Client能夠接受來自任何網站的Cookie(具體設置在IE選項的隱私頁中, 將B站點加入到受信任的站點)
或者將兩個domain都設置爲受信任站點

2. 應用的domain修改
簡單方案: 兩個應用使用同一個domainphp

複雜方案: 能夠在iframe加載的頁面裏經過setdomain來強制更改

3. P3P
第一種: 在要嵌入的內容中(iframe指向的站點)輸出P3P的主機頭聲明, 步驟以下:
> 打開IIS管理器inetmgr
> 選擇被嵌入iframe源站點或者目錄,右鍵點擊打開屬性框
> 切換到HTTP頭
> 添加
> 自定義HTTP頭名: P3P
> 自定義HTTP頭值: CP="CAO PSA OUR"
> 關閉屬性框退出,即刻生效

第二種: 在被嵌入頁面page_onload裏添加一語句:Response.AddHeader("P3P","CP=CAO PSA OUR");html

 

 

 

 

 

 

 

 

 

 

 

------------------華麗分割線----------------------------java

 

 

IE瀏覽器iframe跨域丟失Session問題sql

在開發中,咱們常常會遇到使用Frame來工做,並且有時是爲了跟其餘網站集成,應用到多域的狀況下,而Iframe是不能保存Session的所以,網上能夠找到不少相關的文章,若是網站能夠採用設置Web.Config中的配置: mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="40"
/>
把 cookieless="false"改爲"true"就能夠了但也一樣有個小問題,就是若是頁面中採用Javascript的 window.location.href=''這樣的方式來重定向的話,系統會認爲這是另外一個新的請求,產生一個新的SessionId,致使原 Session一樣的丟失因此對於重定向,仍是使用Response.Redirect()爲好跨域

除了Ifrmae有丟Session問題外,frameset也有一樣的問題Frameset的問題更不肯定,是有時會丟,有時不會丟,這更認人頭痛,在網上找到了一個方法,在頁面page_onload裏添加一語句:
Response.AddHeader("P3P","CP=CAO PSA OUR");
FrameSet中的Session丟失問題就解決了至於裏面具體的緣由 也沒時間去搞懂了瀏覽器


最簡單的方法就是在iis裏設置安全

 

解決辦法服務器

response.addHeader("P3P","CP=CAO PSA OUR")。cookie

不過難道咱們須要在每一個頁面都加這個麼?網絡

不須要的

若是有權配置IIS服務器

打開IIS


管理工具——〉選擇一個網站——〉屬性——〉http頭,增長一個http頭
而後輸入頭名:P3P
輸入頭內容:CP=CAO PSA OUR

若是沒有權限配置IIS服務器,可是你用的是asp.net的話

能夠用httpmodual來實如今所有頁面或者部分頁面頭部插入所須要的標誌

本站點的某個目錄就是這樣實現的

 

二、用P3P header解決iframe跨域訪問cookie

本文來源:http://blog.csdn.net/wonder4/archive/2008/02/27/2125804.aspx


目前在整合幾個應用時,遇到了iframe沒法獲取cookie(session)的問題,通過google,終於把這個問題解決了,如今記錄一下。
   個人需求是這樣的。
   有一個應用是用.net開發的,主要是控制用戶登陸,用戶訪問權限的,部署在上海機房。如今就叫A應用吧
   還有一個應用是用java開發,主要是具體業務的操做。部署在北京機房,這裏叫B應用吧
   因爲已經有一個用戶管理和權限的應用程序,因此java 開發的這個B應用就沒有開發用戶權限的功能,想直接使用.net的A程序。

用戶訪問的流程是這樣的:
    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系統提示訪問受控警告信息。

  一切開發都完成,到整合上線時,發現這個流程走不通,百思不得其解,想了半天也不知道 怎麼回事,google了半天,才發現原來是ie在搗鬼,IE不容許跨域訪問cookie(好象firefox沒問題,ie自6.0之後改用w3c組織的 P3P協議了),再看看個人應用,在第二步設的cookie,在第三步之後全部B應用的訪問請求,ie都把B應用的cookie blocked掉了(由於用戶的訪問是從A應用發起,從A應用訪問B應用的東東,算跨域訪問,IE認爲有安全問題)。。。。(IE狀態欄有一個紅眼睛的 button,點開能夠看到哪些cookie給blocked掉了)

     知道緣由就好辦了,再google知道能夠用P3P header能夠解決問題!
     下面是java的解決辦法之一,也是個人解決辦法,不過個方法不太好:
     直接往響應里加一個P3P的header
     response().addHeader("P3P", "CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\"");

其中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"

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/wonder4/archive/2008/02/27/2125804.aspx

"TST"另外這裏還有一個P3P的驗證工具:http://www.w3.org/P3P/validator.html,能夠驗證一下本身設置的P3P是否正確。這裏還有一個老外寫的不錯的blog,也能夠參考一下。http://www.sitepoint.com/article/p3p-cookies-ie6/2
------------------------------------------------------------------------------------------------------------------------------------------------------
用 P3P 實現隱私參數優選策略
時間:2009-01-01 19:25:05  來源:  做者:
偶爾在yahoo的 頭信息裏看到p3p就上網查了一下 放在這裏儲存
<?php
print_r(get_headers());
?>
結果是這樣的
Array
(
     [0] => HTTP/1.1 301 Moved Permanently
     [1] => Date: Mon, 17 Sep 2007 05:33:26 GMT
     [2] => Location: http://cn.yahoo.com/
     [3] => Connection: close
     [4] => Content-Type: text/html
     [5] => HTTP/1.1 200 OK
     [6] => Date: Mon, 17 Sep 2007 05:33:26 GMT
     [7] => P3P: policyref=」http://p3p.yahoo.com/w3c/p3p.xml「, CP=」CAO DSP COR CU
R ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND
PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV」
     [8] => Connection: close
     [9] => Content-Type: text/html
)


下面爲轉載

做者: BUILDER.COM
Monday, May 20 2002 11:02 AM

 

Platform for Privacy Preferences(P3P,中文稱隱私參數優選平臺)是一種爲網站說明隱私和/或用戶信息策略的XML標準。採用P3P以後網站屬主便可描述其網站所收集的信息內容及其用途,在沒有實現P3P的狀況下,有些用戶在提交表單或者用cookie瀏覽網站時就只得把本身的安全選項設置爲較低級別。而採用 P3P就能夠經過創建代理(agent)的方式來表明用戶參與網絡活動。本文就是對P3P的基本概述。

經W3C宣佈的P3P的5個目標以下:
收集網站數據的標準綱要,也就是所謂的P3P Base Data Schema
用途、收件人、數據類別以及其餘涉及隱私暴露方面的標準集合
表達隱私策略的XML格式
把隱私策略關聯網頁、網站和cookie的方式
經過HTTP傳輸P3P策略的機制

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

P3P的實現
P3P的功能有三個部分組成:一個或者多個策略文件、策略參考文件和源自服務器的HTTP報頭。策略文件應該存放在Web服務器的w3c目錄下(/w3c)。

你不妨對你的網站計劃和評估一下現有的隱私策略。若是沒有這樣的計劃或者策略,那麼在實現P3P以前你就應該制定相應的計劃。隱私策略示例請見Sun網站。如今先讓咱們瞭解實現P3P的基本步驟。

1. 建立策略文件(Policy.p3p)
首先你必須建立一個策略文件。XML策略文件準確描述了信息的內容及其用途。記住,P3P採用了「只有獲得認可的纔是許可的」防範機制,這就是說,只有這個策略文件中描述過的數據才須要採集。P3P規範並無說明怎樣的數據及其處理過程不在包含範圍以內。這樣策略文件就會包含大量信息,好在IBM的P3P策略編輯器在你建立這類文件的時候能夠幫上大忙。

策略文件至少包含了關於網站的聲明語句。該語句的內容是採集何種數據以及如何使用它們的信息。清單A便是實現本身策略的示例。

採集的數據遵循P3P Base Data Schema規定的數據結構。假如實現了多個聲明,那麼各個聲明的目的和數據列表是不一樣的(也許某個網站須要針對cookie、註冊和購物採用不一樣的聲明)。IBM的P3P策略編輯器並無包含不被採集的特殊數據字段,不過,按照W3C提案的規定,我建議你包括網站採集到的特殊數據(比方說:「用戶家庭住址」)。此外文件中最好還要包括Save Zone聲明,Save Zone是網站上同具體用戶無關的信息組成部分。

2. 建立策略參考文件(Policy.xml)
編寫策略文件以後就必須接着建立策略參考文件了。不一樣的網站目錄採起不一樣的隱私策略是徹底可能的。但是,大多數網站一般會在整個網站範圍內再適用單一的策略。建立策略參考文件就是這個過程當中最簡單一步,但是你得保證P3P策略文件的URL和策略名稱(#generalPolicy)寫對了。文件中包含的元素只是策略適用目錄的路徑。清單B中的策略參考示例則包含了根目錄下的所有路徑。

3. 配置服務器
實際上,要真正開始用到P3P你還得先配置你的服務器傳遞一個指向策略參考文件的HTTP報頭。系統配置根據市售各種服務器的差異而不一樣。若是你不具有訪問服務器的權限,那麼你可能得使用<link>標籤或編寫相應的代碼。

在下面的例子裏,P3P是HTTP報頭的名字。冒號之後的全部內容就是報頭的值,它分紅兩個部分:指向策略參考的URL和簡潔策略CP(Compact Policy)。
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瀏覽器也會檢查策略文件而且令策略文件無效。

若是你使用的共享服務器或者Web服務器難以配置HTTP報頭,那麼你不妨將其添加到你的 HTML或Java代碼中。我就在本身的JSP文件中添加了下列代碼:

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>

檢查和測試
IBM的P3P編輯器能夠對你的P3P文件而整個隱私系統的實現進行檢查。幸虧,W3C在網上推出了一種檢查工具。你不妨輸入本身主頁的URL看看檢查工具是如何工做的。它會說明你的P3P實現中存在的語法或配置錯誤。此外,你也能夠IE 6.0的菜單中選擇View–> Privacy Report,列出所有站點,而後選擇你的網站並單擊Summary按紐查看你的隱私報告。

小結
最後,策略參考文件(P3P.xml)和策略文件(Policy.p3p)都被建立出來了。Policy.p3p文件是完整策略;它被 P3P.xml(或 Policy.xml)引用,這個能夠經過查看HTTP報頭認識到這一點。W3C強烈建議你在Web服務器上把這些文件存放在一個/w3c目錄下。若是每一個人都在用着同一目錄,那麼,就算HTTP報頭沒被收到,用戶代理也能找到這些文件。 來源:http://blog.sina.com.cn/s/blog_406127500100l732.html

相關文章
相關標籤/搜索