跨域session相關問題資料收集

以下的方法都還沒有驗證過,參考資料收集中。
 
****************************************************************
原帖地址:http://hechengrong.javaeye.com/blog/149918
 
問題描述: 
   在一個應用(domain: A)的某個page中, 通過IFrame的方式嵌入另一個應用(domain: B)的某個頁面. 當兩個應用的domain 
不一樣時, 在被嵌入的頁面中不允許使用cookie(即使用cookie實現的session會失效). 


問題分析: 
   在XP SP2和IE6之後,從安全性角度考慮,默認狀態下不允許在iframe裏使用跨站點cookie。 




解決方案: 
   1. 修改Client的設置 
    使Client可以接受來自任何網站的Cookie(具體設置在IE選項的隱私頁中)(測試通過). 
   或者將兩個domain都設置爲受信息站點(測試通過). 


   2. 應用的domain修改 
    簡單方案: 兩個應用使用同一個domain(沒有測試). 
   複雜方案: 可以在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")(測試通過);
****************************************
原帖地址:http://strangeromo.javaeye.com/blog/271610
1.頁面裏的COOKIE不能是瀏覽器進程的COOKIE(包括驗證票和不設置超時時間的COOKIE),否則跨域會取不到.這點做跨域COOKIE的人比較少提到.不過實際上留意下幾家大學做的方案,有細微的提到他們的驗證模塊裏的COOKIE是有設置超時時間的.


2.當利用IFRAME時,記得要在相應的動態頁的頁頭添加一下P3P的信息,否則IE會自覺的把IFRAME框裏的COOKIE給阻止掉,產生問題.本身不保存自然就取不到了.這個其實是FRAMESET和COOKIE的問題,用FRAME或者IFRAME都會遇到.


3.測試時輸出TRACE,會減少很多測試的工作量.


只需要設置 P3P HTTP Header,在隱含 iframe 裏面跨域設置 cookie 就可以成功。他們所用的內容是:


P3P: CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'


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")


**************************************************************


原帖及討論:http://bbs.bc-cn.net/dispbbs.asp?boardID=10&ID=168248


*/ --------------------------------------------------------------------------------------
*/ 出自: 編程中國  http://www.bc-cn.net
*/ 作者: 不惑        QQ:7284911
*/ 時間: 2007-9-6  編程論壇首發
*/ 聲明: 尊重作者勞動,轉載請保留本段文字
*/ --------------------------------------------------------------------------------------




前幾天因爲一企業網站,內有一客戶的服務系統,那個網站因爲是租用的空間,不足以存放客戶系統,所以另外搞了個服務器,爲了使域名的統一性(另一個服務器的域名與原域名差別過大),所以把這個客戶系統用框架包含在了原來的網站內,但碰到了因爲跨域操作而使客戶系統用戶登陸後發生session丟失的問題,困撓了一整天,也在此發貼徵求解決方法,見:http://bbs.bc-cn.net/dispbbs.asp?boardID=10&ID=167628&page=3。後經本人多方查找資料,經過本人分析和試驗,終於把這個問題給解決了,今天見有人問要程序,所以寫這個貼子,以供大家共享。
首先說明原理:
系統是認一個一個程序範圍的,一般來說,一個IE默認爲一個程序範圍.
框架因爲有了跨域的內容,所以它首先默認的是框架程序本身的程序範圍,這樣使得框架內的程序範圍得不到確認.
爲了讓這個IE默認爲框架內的程序範圍,所以我使用了多次跳轉.
首先,跳出本框架,進入一個無框架的需要session值的網站頁面(就叫它B服務器的頁面),並在這個頁面中生成一個session以便系統自動生成一個sessionID,然後又跳回到有框架的頁面.因爲系統已經爲這個IE生成了一個sessionID,所以只要不關掉這個IE,系統一直以爲這個IE是本程序範圍的.這樣,再次生成的session值就得以在這個ID中生存下來.
也就達到了騙過系統的目的.
再補充一點,二次跳轉使用了不同的方式,原因是我需要把框架外的信息丟棄,而要保存框架內的信息.
而不同的跳轉方式會丟棄或保存跳轉前的信息的。
程序實現方式:
文件1:
框架文件:index.htm(運行在服務器A上)
<html>


<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<title>奇豪門業</title>
</head>
<frameset rows="1,*" border=0 frameborder="0">
  <frame name="winBackLoad" scrolling="no" noresize target="mainweb1" src="default_top.htm">
  <frame name="mainweb1" src="http://www.serverB.com/index.asp" scrolling="auto">
  <noframes>
  <body>


  <p>此網頁使用了框架,但您的瀏覽器不支持框架。</p>


  </body>
  </noframes>
</frameset>


</html>




文件2:index.asp (運行在服務器B上,作用跳轉和生成sessionID)
<script>
if (top.location !== self.location) {
top.location=self.location;
}
//這個JS的目的是跳出框架運行
</script>
<%
if session("xm2")="" then
  session("xm2")="eee"
'上面這一句的目的只是爲了使用session,讓系統爲這個IE生成一個sessionID,並且判斷一下是不是已經跳轉過,免得引起死循環。
%>
<META HTTP-EQUIV=REFRESH CONTENT="0;URL='http://www.serverA.com/index.htm'">
<%
,上面這一句是回到框架,注意:只能用上面這個跳轉的方法,別用下面的跳轉方法。
else
Response.Redirect "index2.asp"
'上面一句纔是真正地跳轉運行服務器B上的程序!注意:也只能用這方法跳!
end if%>


經過以上的跳轉,本IE已經有了服務器B上的sessionID,也就是說,框架雖然是在服務器A上的主框架運行,但它可以確保服務器B上的session不丟失,達到跨域運行的目的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章