2007年5月15日 星期二

CakePHP使用手冊-安全性元件(Security Component)

轉貼自 http://www.ezluk.org/

安全性元件(Security Component)


第一節



引言


Security component是用來避免controller action受到惡意或錯誤的request攻擊。
它讓你可以設定action可以被呼叫的條件,並可指定不合條件事如何處置。
同樣的,在使用Security component前,得先確定'Security'有出現在controller的$components陣列裡。



第二節



保護Controller的Action


Security component包含二個主要方法限制對controller action的使用權:





  • requirePost

  • string $action1

  • string $action2

  • string $action3...



特定的action必需透過POST呼叫才能執行。





  • requireAuth

  • string $action1

  • string $action2

  • string $action3...



比較POST過來的表單資料內的認証金鑰和存在使用者的session內的認証金鑰是否相同,如果相同就允許執行這個action。
這裡得注意一點,為了保有彈性,只有透過POST傳資料才會啟動作。
如果是由一般的GET request呼叫action,requireAuth()則不會有任何動作。
為了達到最高的安全性,你應該在想要完整保護的action內使用requirePost()強制使用POST,再用requireAuth()檢查金鑰。
第四節會再仔細說明認証金鑰是如何產生,如何消失。但先讓我們看個簡單的範例:



class ThingsController extends AppController

{

    var $components = array('Security');



    function beforeFilter()

    {

        $this->Security->requirePost('delete');

    }



    function delete($id)

    {

        //這個動作只有透過HTTP POST request才能執行

        $this->Thing->del($id);

    }

}

 


這兒,我們告訴Security component 'delete' action必需透過POST request才能執行。
通常我們會將告訴Security(和其他大部分的component)要怎麼做的程式放在beforeFilter()裡。
因為beforeFilter()會在action執行前被呼叫,接著立即執行action,這個時間點正是我們需要的。


你可以試著在流覽器內輸入這個action的URL,看看會發生什麼事。



第三節



處理非法的Request


所以,如果有個request不符合我們設定的安全需求,又會發生什麼事呢?
預設,這個request會變黑洞,client會收到404檔頭,應用程式立即中止。
然後,Security component還有個$blackHoleCallback屬性,讓你設定成定義在controller裡的回呼函式名稱。



除了單純給個404檔頭然後不做任何回應外,這個屬性可以讓你對此request做一些額外的檢查,
將它導向另一個位置,或甚至將對方的IP位置記錄下來。
然而,如果你選擇了使用回呼函式,那麼在request不合法時結束程式就完全是你的責任了。
如果回呼函式傳回true,否則Security component會繼續另一個檢查另一個安全需求。
否則,程式會停止檢查動作,繼續執行下面的行為,不會中止。



第四節



進階Request認証


requireAuth()函式允許你仔細的設定action可以從那兒執行與如何執行,但它同樣也有一些規定在,
在你了解認証動作的執行方法後就會明白。
如上述,requireAuth()是將POST資料與使用者的session資料內的認証金鑰相比較。
所以,所以在收到request和發出request的二個controller內都必需包含Sequrity component。



例如,如果有一個PostController的action,它的view內含表單會發出POST rquest呼叫CommentsController的action,
那麼,CommentsController和PostsController 都要包含Security component。



每次載入Security compoent時,即使它並沒有被用來保護任何action,都會做這些事:
首先,用核心的Security類別產生一個認証金鑰。接著,將這個金鑰寫到session裡,同時附上過期時間和額外的資訊(
過期時間可以在/app/config/core.php內的session安全設定中設定)。
然後,在隨之使用的controller內設定此金鑰。



接著,在view檔內任何使用$html->formTag()產生的表單標籤都會暗藏內含認証金鑰的輸入欄位。
在表單被POST時,Security component就可將此值與session裡的值(放在rquest最後面)比對。
隨後,認証金鑰會被重建,所有動作再重覆一次。


沒有留言:

網誌存檔

關於我自己

Aspire freedom , Hope to do Soming make self complete ~