【问题标题】:PHP 5 - Securing an admin area of a sitePHP 5 - 保护站点的管理区域
【发布时间】:2011-03-20 20:38:22
【问题描述】:

我目前正在编写几个使用 Kohana 作为框架的 MVC 站点。每个都有一个简单的管理区域,管理员可以在其中上传和编辑内容。我目前正在将管理员的用户模型存储在会话中,并使用以下方法检查他们是否是管理员:

private function checkAdmin()
{
    if (!isset($_SESSION['admin']) || $_SESSION['admin']->Level !== 'admin')
    {
        header('Location: /admin');
        exit;
    }
}

我在所有其他管理控制器方法中调用此方法,如下所示:

public function writeReview()
{
    $this->checkAdmin();

    // rest of the method
}

我只是想知道是否有什么可以改进的。这似乎是一个单点故障,让我闻起来很臭,所以在确定这一点之前,我有点厌倦了继续前进。

【问题讨论】:

    标签: php security model-view-controller kohana


    【解决方案1】:

    如果这是 Kohana 2.x 版,我会移动 $this->checkAdmin();进入控制器的构造函数。如果这是 3.x 版,我会把它放在 before() 方法中。这将确保每条路线都受到保护。

    【讨论】:

      【解决方案2】:
      1. 仅当用户不是管理员时,您的函数才会重定向到 /admin。如果这是预期的结果,那很好。

      2. -- 算了,我的错。

      3. checkAdmin() 函数依赖于重定向,因此仅在您想要重定向的情况下才有用。例如,如果您在处理脚本中使用它(并且您应该检查它是否是处理脚本中的管理员),您只需要返回 true 或返回 false。我建议将其作为基本函数,以及一个重定向函数调用,或者替代,接受和可选参数来重定向。

      【讨论】:

      • 按照我现在的方式,所有的管理功能都在它自己的控制器中。它的 index() 只是一个登录表单。成功登录设置会话变量。如果登录失败,或者有人尝试访问控制器的任何公共方法,我只想将它们重定向。我认为将目的地更改为站点的主控制器会更好。我只是想尽可能地隔离管理部分。
      【解决方案3】:

      如果您想让用户共享他们的登录信息,但否则生成每个会话/登录密钥并将其存储在数据库中将进一步锁定事情。这样,如果有人使用您的密码登录,您将被踢出并立即知道它已被盗用。

      要做的其他基本事情 - 存储上次登录的日期、IP ......这类东西。这不仅仅是一件事情,而是很多! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        相关资源
        最近更新 更多