2008-07-18

Secure Cross-Domain Web Communication

以前在寫AJAX的東西時,遇到一個問題,就是無法跨網域連線,後來查了一下原因,是因為瀏覽器會遵守一個「Same-Origin Policies」,簡單來說,就是禁止不同網域的網站,存取目前連線網站的資源,例如cookie、script等,以避免類似存取記載敏感資訊的cookie,或是Javascript Hijack

然而現在很多Web Service都強調所謂的「mashup」,所以常常會需要存取跨網站的資源。因此有一般常見的方法有幾種:

  1. 透過proxy server
  2. 使用script tag
  3. 使用Fragment Identifier Messaging


不過這些方法都有效能或是安全的議題,這裡有比較詳細的說明 XML.com

目前有個Standford的學生,跟一位微軟的研究員提出一種方法,透過Subspace來做到更安全的跨網域連線,主要的原理就是在原本的視窗中,產生一個中介的iFrame,裡面再放一個iFrame連線到不受信任的網站,進行步驟如下:

  1. 假設目前頁面為www.mashup.com
  2. 產生一個隱藏的iFrame (mediator frame),連線到目前網域的頁面
  3. 在mediator frame中產生一個iFrame (untrusted frame),連線到子網域的頁面(例如webservice.mashup.com)
  4. 在主視窗產生一個communication object (CB),並且傳到mediator frame (由於主視窗跟mediator frame是同網域,所以可以傳遞資料)
  5. 把mediator frame跟untrusted frame的document.domain都設成marshup.com,此時untrusted frame可以跟mediator frame交換資料,但由於跟主視窗domain不同,所以不能跟主視窗資料交換資料
  6. 將 CB 由mediator frame傳到untrusted frame,此時主視窗跟untrusted frame都擁有相同的 CB
  7. 在untrusted frame中,利用script tag來取得目標網域的資料,並且在資料傳遞完成後,透過 CB 的callback function來呼叫主視窗的function,進行資料處理 (IE & Firefox);或是在主視窗做pooling的動作,持續檢查untrusted frame是否已經取得所需資料 (Safari & Opera)


這邊其實敘述的很簡單,更詳細的資料可以參考他們發表的paper (PDF),或是到網站上看實作demo

=====

看完除了對cross-domain的ajax有更多的瞭解外,也終於知道,之前有關iFrame使用時,child frame跟parent frame互動上的問題所在....原來是不同瀏覽器對iFrame的一些行為不同~XD

No comments: