cakePHP和CRUD操作的授权

时间:2013-04-05 16:07:54

标签: security cakephp

我有一个cakephp 1.3应用程序,我遇到了“数据泄漏”安全漏洞。我正在寻找使用蛋糕的最佳解决方案,而不仅仅是能够起作用的东西。该应用程序是一个成绩跟踪系统,让教师输入成绩,学生可以检索他们的成绩。一切都按预期工作,但当我开始审计安全性时,我发现基本的CRUD操作有泄漏。这意味着学生X可以看到学生Y的成绩。学生应该只看到自己的成绩。我将这些问题限制在阅读操作中。

使用cake,我有一个带有此视图功能的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操纵URL并将其更改为6,则会显示#6的成绩。经典的数据泄漏安全漏洞。

我对解决这个问题的最佳方法有两点想法。 1)我可以为控制器中调用的每个CRUD操作添加检查。或者2)向模型添加代码(例如使用beforeFind())以检查人X是否有权访问该数据元素。

选项#1似乎很耗时且容易出错。 选项#2似乎是最好的方式。但是,它需要在某些操作之前调用find()。上面的read()示例从不执行beforeFind(),并且没有beforeRead()回调。

连连呢?

2 个答案:

答案 0 :(得分:2)

不要在控制器中使用通用read(),而应将ALL查找,查询..等移动到相应的模型中。

然后,浏览每个模型,并在需要限制的任何查找中添加所需的任何类型的安全检查。 1)它将是更多的DRY编码,2)您将能够更好地管理这样的安全风险,因为您知道所有查询的所在位置。

对于您的示例,我将在getGrade($id)模型中创建Grade方法,并针对您的Auth用户ID student_id检查CakeSession::read("Auth.User.id");字段(或其他)

您还可以构建一些类似于is_owner()的通用方法,以在多个方法中重复使用相同的逻辑。

答案 1 :(得分:0)

如果CakePHP支持isAuthorized,您可以执行以下操作:

创建一个包含用户类型的列(例如'student','teacher',...)

现在,用户的类型是“学生”,您可以限制他们的访问权限,仅查看他们的数据。 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);
                }
            } 
        }
}