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

2008-06-24

C++裡讓物件可以用cout和cin來做I/O存取

很簡單,利用friend及operator overloading
舉例來說,

class Test {
public:
friend istream &operator>> (istream &i, Test &test) {
return i>>test.data;
}
friend ostream &operator<< (ostream &o, const Test &test) {
return o<<test.data
}
private:
int data;
};

如此一來,就可以使用cout和cin來做類別的I/O了

2008-06-11

用Canvas做的俄羅斯方塊

Canvas是一個新的HTML Element,目前只有在FireFox 1.5 latter、Safari或Opera裡面才有支援(就IE不支援*_*),它被定義在所謂的HTML 5裡面。

顧名思義,Canvas就是在瀏覽器裡面提供可以畫圖的物件,透過Javascript去操作Canvas的各種功能,網路上有強者透過Canvas做出一款馬力歐賽車,壓縮過的script才11Kb,很厲害~!!!

我也用Canvas做了一個簡單的俄羅斯方塊,可以試試看~! 點這邊開啟

(不過目前還有一些小bug,在Safari裡面沒辦法移動方塊 >_< 查了一下原因,Safari的onkeypress event抓不到arrow,改成用onkeydown就可以了)



更多有關Canvas的說明與教學,可以到Mozilla Developer Center去看。

2008-05-29

網頁的刪除線

常常看到別人的網誌裡面,如果有文章已發表,可是後來又想修改的時候,會在原文畫刪除線,再把新的內容寫上去。就像這樣子,這邊是要刪除的原文,這邊是新內容。

方法就是在要畫刪除線的地方用<s></s>包起來,就像是<s>這邊是要刪除的原文</s>。

很簡單,可是我之前竟然不知道 @_@

2008-05-09

三個等號(===)跟兩個等號(==)的差別

在一些對於變數型別比較沒那麼要求的語言,也就是會在比較變數的時候,會自動轉換成同型別比較,例如PHP、Javascript等,使用三個等號可以避免自動轉換型別,舉例來說:


echo 1==1; //true
echo 1==1.0; //true

顯示結果都會是true

可是如果改成

echo 1===1; //true
echo 1===1.0; //false

顯示的結果第一個會是true,第二個就會是false。

使用"==="的好處在於
1. 速度比較快 (因為省略了型別轉換)
2. 有的情況下,希望數字比較時能連型別一起比,就需要用到"==="

值得注意的是,在PHP及Javascript中

"AAA"==='AAA'; //true

都會是true。