【问题标题】:Avoid "user cross access" in Symfony避免 Symfony 中的“用户交叉访问”
【发布时间】:2012-05-20 23:53:37
【问题描述】:

我目前正在开发一个基于 Symfony 1.4 的项目。我正在使用 sfDoctrineGuardPlugin 来验证我的两种用户:用户和管理员。对于每个模块和模块中的每个操作,我使用凭据来防止执行未经授权的操作。

但我面临一个问题:例如,如果用户想要编辑一个项目,URL 将类似于 frontend.php/project/edit/id/1。在这里,我们假设项目#1 属于他。现在,假设项目#2 不属于他。如果他键入 URL frontend.php/project/edit/id/2,他将可以访问编辑表单,并且能够编辑不属于他的项目。 p>

如何防止这种行为?

我想避免在显示编辑表单之前验证每个可编辑模型的所有权...但是我可以做不同的吗?

您有什么好的做法或建议来防止这种行为吗?

非常感谢!

【问题讨论】:

    标签: symfony-1.4


    【解决方案1】:

    由于您必须签入项目以了解当前用户是否被允许编辑项目,所以我认为您除了在操作部分进行编辑前验证之外别无他法。你为什么不想这样做呢?

    这个检查可以在 preExcute 函数中完成:

    public function preExecute()
    {
      $request = $this->getRequest()
      if ($request->hasParameter('id'))
      {
        $project = Doctrine_Core::getTable('Project')->find($request->getParameter('id'));
        $user_id = $this->getUser()->getGuardUser()->getId();
    
        $this->forward404If(
          $project->getUserId() !== $user_id, 
          'User #'.$user_id.' is not allowed to edit project #'.$project->getId()
        );
      }
    }
    

    【讨论】:

    • 感谢您的回复。这绝对是一种方法,但在我看来这是一个常见问题,我希望有一种更有效的方法来做到这一点。
    • 嗯,我知道,但我没有找到其他方法(你不能用凭证)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多