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嵌入的第三方網站程式碼中加入如下程式碼:
-
response.setHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
要注意的有:
1、上段程式碼是jsp的,如果是asp或php等,需要改成相應的語法,引數和取值不變。如ruby為:
- 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
點評:與上一個方法類似,此方法也要求第三方在可控可管理。