2014年8月1日 星期五

yii framework - 如何避免跨站請求偽造攻擊(CSRF)?

要開啟CSRF功能, 必須先到config/main.php裡新增以下code:

'request' => array(
            'enableCsrfValidation' => true,
        ),
 
避免遭受到CSRF攻擊有兩個注意的地方:
1. GET只能用在查資料, 不能用在其他資料庫的操作.
2. POST必須要能產生一個隨機值並且讓server端能辨識, 進而回傳資料到client端.
 
所以在yii裡面使用表單傳送(POST)的時候, 一定要使用CHtml::form, 或是Widget的CActiveForm.
千萬不要自己寫HTML, 要不然會出現以下的error:

Error 400

The CSRF token could not be verified.
因為用yii內建的來寫form, 它會生成一個隱藏的input, 裡面會有一個隨機的值, 以防止CSRF攻擊!
 
另外, 你會發現我們使用gii建立的後台, 刪除功能居然不能用了!!! 怎麼會這樣呢?
其實就像上面說的,  GET只能用在查資料, 不能用在其他資料庫的操作.
所以我們必須要做些設定, 以刪除功能為例, 原本的code如下:
array('label' => 'Delete', 'url' => '#', 'linkOptions' => array( 
 'submit' => array( 
  'delete', 'id' => $model->id), 
  'confirm' => '你確定要刪除' . $model->name . '?' 
 ),
),

請改為

array('label' => 'Delete', 'url' => '#', 'linkOptions' => array( 
 'submit' => array( 
  'delete', 'id' => $model->id), 
  'confirm' => '你確定要刪除' . $model->name . '?' 
  'csrf' => true,
 ),
),

這樣問題就解決嘍^^