首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRUD操作的cakePHP和授权

CRUD操作的cakePHP和授权
EN

Stack Overflow用户
提问于 2013-04-06 00:07:54
回答 2查看 645关注 0票数 1

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

使用cake,我得到了一个具有以下视图函数的grade_controller.php文件:

代码语言:javascript
复制
function view($id = null) {
   // Extra, not related code removed
   $this->set('grade', $this->grade->read(null, $id));
}

代码语言:javascript
复制
http://localhost/grade/view/5

显示学生$id=5的成绩。太棒了。但是,如果5号学生操作URL并将其更改为6,则会显示6号学生的成绩。经典的数据泄漏安全漏洞。

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

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

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-06 00:20:04

你应该把所有的finds,queries..etc移动到相应的模型中,而不是在你的控制器中有一个通用的read()

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-04-06 14:28:59

如果CakePHP支持isAuthorized,你可以这样做:

创建一个列,其中包含用户类型(例如‘学生’,‘老师’,...)

现在,如果用户类型是“学生”,您可以限制他们的访问权限,只查看他们的数据。下面是isAuthorized的一个例子。我只允许学生编辑他们的个人资料信息。你可以扩展这个概念。

代码语言:javascript
复制
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);
                }
            } 
        }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15838578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档