【问题标题】:cakePHP and authorization for CRUD operationscakePHP 和 CRUD 操作授权
【发布时间】:2013-03-28 03:25:56
【问题描述】:

我有一个 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() 回调。

建议?

【问题讨论】:

  • 您的网站上是否有用户认证系统?如果是这样,您应该将用户分组在一起。然后,您可以将逻辑添加到您的读取功能,以允许学生组中的用户只能访问他们自己的用户 ID 中的数据。这就是我要走的路。

标签: security cakephp


【解决方案1】:

您应该将所有查找、查询等移动到相应的模型中,而不是在控制器中使用通用的 read()

然后,检查每个模型,并为需要限制的任何发现添加所需的任何类型的安全检查。 1) 它将是更多的 DRY 编码,并且 2) 您将能够更好地管理这样的安全风险,因为您知道所有查询都保存在哪里。

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

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

【讨论】:

【解决方案2】:

如果 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);
                }
            } 
        }
}

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多