1. 程式人生 > >IE下iframe跨域session和cookie失效問題的解決方案

IE下iframe跨域session和cookie失效問題的解決方案

問題來源:

何為跨域跨域session/cookie?

也就是第三方session/cookie。第一方session/cookie指的是訪客當前訪問的網站給訪客的瀏覽器設定的seesion/cookie, 會被儲存在訪客的計算機上。第三方session/cookie指的是當前訪問的網站中會載入(嵌入)另外第三方的網站程式碼,例如促銷廣告,那麼第三方網站也會在訪客的計算機上新增session/cookie,這種就是第三方session/cookie。

IE限制第三方session/cookie

隨著IE版本的不斷更新,版本之間變化很大,其相容性問題困擾著許多開發者。本問題也不例外,IE7以後,微軟逐漸改進了IE安全性,其中預設設定下第三方session/cookie是不允許使用的,這就造成了使用iframe嵌入式訪問另外的第三方網站時,不能為其儲存會話狀態,無法進行登入或跨越取值,從而影響第三方網站功能的使用。

解決方法

手動調整客戶端IE瀏覽器的安全級別

在Internet選項-隱私卡中,調低安全級別到接受所有cookie,或者在[高階]中設定接受第三方cookie。

點評:此方法需要使用者更改客戶端瀏覽器設定,極不便利,且會給使用者電腦帶來安全隱患,故不推薦。

程式碼中使用P3P協議自動更改IE瀏覽器安全級別

P3P(Platform for Privacy Preferences)是一種可以提供這種個人隱私保護策略。具體做法是在被iframe嵌入的第三方網站程式碼中加入如下程式碼: 

  1. response.setHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
    );  

要注意的有:

1、上段程式碼是jsp的,如果是asp或php等,需要改成相應的語法,引數和取值不變。如ruby為:

  1. response.headers["P3P"] = "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""

2、此方法僅支援動態Web應用,也就是需要使用動態語言設定response的header,且如果是MVC架構的話,最好是在總控制器或過濾器中新增上段程式碼,這樣改動最小。

點評:該方法不需要手動修改客戶端IE設定,但需要修改第三方網站的程式碼,對於第三方網站不在控制範圍內情況下無能為力。

在第三方網站伺服器中設定P3P協議

第三方網站所使用的應用伺服器程式,如果支援設定HTTP頭,那麼可以通過設定伺服器而不必修改第三方網站程式碼。

例如IIS下,可以開啟IIS視窗——〉選擇一個網站——〉屬性——〉http頭,增加一個http頭

然後輸入頭名:P3P

輸入頭內容:CP=CAO PSA OUR

點評:與上一個方法類似,此方法也要求第三方在可控可管理。

參考文件: