2013-04-05 115 views
1

我有一個cakephp 1.3應用程序,我遇到了「數據泄漏」安全漏洞。我正在尋找使用蛋糕的最佳解決方案,而不僅僅是可以工作的東西。該應用程序是一個成績跟蹤系統,可讓教師輸入成績,學生可以檢索成績。一切都按預期工作,但是當我開始審計安全性時,我發現基本的CRUD操作有泄漏。這意味着學生X可以看到學生Y的成績。學生只能看到自己的成績。我將把這個問題限制在讀操作中。cakePHP和CRUD操作授權

使用的蛋糕,我有這個觀點功能的grade_controller.php文件:

function view($id = null) { 
    // Extra, not related code removed 
    $this->set('grade', $this->grade->read(null, $id)); 
} 

而且

http://localhost/grade/view/5 

顯示了學生的$ id = 5的檔次。那很棒。但是,如果學生#5操縱網址並將其更改爲6,則會顯示6號人的成績。經典的數據泄露安全漏洞。

我有兩個想法來解決這個問題的最佳方法。 1)我可以將檢查添加到控制器中調用的每個CRUD操作。或者2)向模型添加代碼(例如使用beforeFind())來檢查人員X是否有權訪問該數據元素。

選項#1似乎是耗時且容易出錯的。 選項#2似乎是最好的選擇。但是,它需要在某些操作之前調用find()。上面的read()例子從不執行beforeFind(),並且沒有beforeRead()回調。

對此提出建議?

+0

您的網站上有用戶認證系統嗎?如果是這樣,你應該將用戶分組在一起。然後,您可以添加邏輯到您的閱讀功能,以允許學生組的用戶只能訪問他們自己的用戶ID中的數據。這是我會採取的路線。 – m1ket 2013-04-05 16:14:18

回答

2

而不是在您的控制器中有一個通用的read(),您應該將所有查找,查詢......等移動到相應的模型中。

然後,遍歷每個模型並在需要限制的任何查找中添加需要的任何類型的安全性檢查。 1)它會更加乾燥的編碼,2)你最好能夠管理這樣的安全風險,因爲你知道你的所有查詢都在哪裏。

對於你的榜樣,我會在我的Grade模型創建getGrade($id)方法,並檢查student_id場(或其他)對您的身份驗證的用戶ID CakeSession::read("Auth.User.id");

你也可以建立一些類似於is_owner()泛型方法(S)在多種方法中重用相同的邏輯。

+0

paginate()調用呢?通常在控制器中找到,並且是find()的增強版本。 – Michaelkay 2013-04-08 17:06:05

+0

@Michaelkay - http://stackoverflow.com/questions/6501849/paginate-from-within-a-model-in-cakephp – Dave 2013-04-10 04:13:37

+0

完美!這正是我需要的 – Michaelkay 2013-04-10 15:28:06

0

如果CakePHP的支持isAuthorized,這裏的東西,你可以這樣做:

創建一個列,具有類型的用戶(如: '學生', '老師',...)

現在,它的用戶類型是'學生',你可以限制他們的訪問,只查看他們的數據。 isAuthorized的一個例子如下。我允許學生只編輯他們的個人資料信息。你可以擴展這個概念。

if ((($role['User']['role'] & $this->user_type['student']) == $this->user_type['student']) { 
     if (in_array($this->action, array('view')) == true) { 
       $id = $this->params->pass[0]; 
       if ($id == $user_id) { 
        return (true); 
       } 
      } 
     } 
}