1

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

建议?

4

2 回答 2

2

与其read()在控制器中使用泛型,不如将所有查找、查询等移动到相应的模型中。

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

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

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

于 2013-04-05T16:20:04.393 回答
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);
                }
            } 
        }
}
于 2013-04-06T06:28:58.963 回答