2013-04-05 116 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); 
       } 
      } 
     } 
}