【问题标题】:session security in OOP/MVCOOP/MVC 中的会话安全
【发布时间】:2023-04-01 01:25:01
【问题描述】:

这个问题专门关于如何在基于函数/OOP/MVC 的环境中正确实现会话安全。

我熟悉程序文件中的会话安全性 - 如果我有一个按程序编写的 control_panel.php 文件,我可以简单地在页面顶部检查会话安全性,或者只要逻辑要求它首先加载.

但是,我是 OOP/MVC 新手,我的页面现在只是一堆函数!

希望我不需要在每个函数中检查会话安全性..?

请注意,我使用的是 CodeIgniter2。

这是我的代码示例:

<?php

class Main_controller extends CI_Controller {

public function __construct() {
        parent::__construct(); 
}

public function index() {
   //$this->load->view(my_view);
   //run some code
}

public function function1() {
   //$this->load->model(my_model);
   // run some code
}

private function function2() {
   //$this->load->view(my_view2);
   //run some code
}
?>

在程序化的 php 页面中,它看起来像这样:

<?php

// check user login
if (isset($_SESSION["user"]) && !empty($_SESSION["user"])) {

// all of the code on the page

}
?>

【问题讨论】:

  • 似乎在 OOP 的页面顶部进行会话安全检查不起作用。我发现如果我去 www.mysite.com/Main_controller/function1/ 它只会加载 function1。

标签: php security model-view-controller oop codeigniter


【解决方案1】:

有原生session library in Codeigniter。还有几个扩展库。如果您搜索 CI 社区,则有很多类型和示例。使会话库自动加载表单config/autoload.php 并检查主控制器内的会话验证。

【讨论】:

    【解决方案2】:

    将基本控制器扩展为MY_Controller - 并将检查放在那里。

    class MY_Controller extends CI_Controller
    {
        public function __construct() 
        {
            parent::__construct();
    
            if ( ! isset($_SESSION["user"]) OR (empty($_SESSION["user"]))
            {
                // User not logged in - so send them to the home page
                redirect ("/");
            }
        }
    }
    

    然后为您想要“安全”的每个控制器扩展MY_Controller,除非用户登录,否则将无法访问它们中的任何一个

    class Main_controller extends MY_Controller
    {
        public function __construct() 
        {
            parent::__construct(); 
        }
    
        public function index()
        {
            //$this->load->view(my_view);
            //run some code
        }
    
        public function function1()
        {
            //$this->load->model(my_model);
            // run some code
        }
    }
    

    查看这里了解更多信息:http://codeigniter.com/user_guide/general/core_classes.html

    【讨论】:

    • 请注意,MY_Controller.php 不在 application/libraries 文件夹中,而是在 application/core 中
    【解决方案3】:

    在我看来,上述解决方案适用于简单的登录验证。如果您想根据登录的用户类型和其他情况来控制页面,会发生什么。根据我的经验,扩展基类始终是一个挑战,基类应该用于通用和横切关注点。我建议实现一个单独的类来处理您的验证需求,然后在需要时调用这些类,例如

    public function function1()
    {
        if(SessionManager::CheckRights("IsMember"))
        {
            //$this->load->model(my_model);
            // run some code
        }
        else
            ......
     }
    

    【讨论】:

      猜你喜欢
      • 2013-12-01
      • 2013-05-03
      • 2013-08-06
      • 2017-10-15
      • 2011-11-06
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 2012-07-22
      相关资源
      最近更新 更多