用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4105|回复: 7
收起左侧

[版本 3.x] CI框架的MY_Controller使用问题求教

[复制链接]
发表于 2016-6-14 10:24:22 | 显示全部楼层 |阅读模式
本帖最后由 无敌BKB 于 2016-6-14 10:26 编辑

各位,请教个问题啊,我用ci,加载了自己写的MY_Controller,为什么每次
PHP复制代码
abstract class MY_Controller extends CI_Controller
{
    /**
     * 保存当前登录用户的信息
     **/

public $user_id;   //保存uid
    /**
     * 构造函数
     */

public function __construct()
    {
        parent::__construct();
$this->check_login();
    }
 
    /**
     * 验证是否登录(user_id是否存在),如果没有登录,则检查是否有保存的ci_session,并用赋值给user_id
     */

protected function check_login()
    {
        if(!$this->user_id){
            if($result = $this->db->get_where('active_session',array('session'=>$this->input->cookie('ci_session', TRUE)))->row_array()){
                $this->user_id = $result['uid'];
                //  print_r($this->user_id);die;  在这个位置打印出$this->user_id 是存在的            }
        }
        else{
            print_r($this->user_id);die;
        }
    }
 
复制代码



我的MY_Controller文件大概如下,每次刷新为什么$this->user_id 都是不存在的呢? 但是我在上面的代码里面打印出$this->user_id是存在。但是刷新页面后,他又不存在了,这是什么原因呢?该怎么解决?






 楼主| 发表于 2016-6-14 10:24:45 | 显示全部楼层
麻烦帮忙看下,谢谢了
发表于 2016-6-14 10:44:29 | 显示全部楼层
你的檢查方式太過於「特殊」了
尤其這段 :
$result = $this->db->get_where('active_session',array('session'=>$this->input->cookie('ci_session', TRUE)))->row_array()

他有兩個問題 :
1. 嚴重的安全性漏洞
2. 在 if() 裡面,是給你判斷,而不是拿資料,請分開處理

登入流程可以考慮用這種方式 :
1. 使用者登入
2. 以使用者帳密取得使用者個資
3. Sesson 類紀錄必要資料
4. 檢查該 Sesson 的 Key 值判斷是否登入

 
 楼主| 发表于 2016-6-14 10:59:56 | 显示全部楼层
Closer 发表于 2016-6-14 10:44
你的檢查方式太過於「特殊」了
尤其這段 :
$result = $this->db->get_where('active_session',array('sess ...

谢谢啊,我是自己参考之前看到的CMS,他是这样处理的。
1、用户登录,校验账号密码正确后,将他的session_id写入数据库的一个表中,然后弄了个全局的$this->user_id 等于用户的uid,这个变量在任何页面都可以使用,
2、用户第二次打开页面后,去判断他的session_id是否在数据库中,来验证他是否已经登陆(当用户勾选了保保持登陆选项,他会把session_id写入cookies一定日期),几天内,都能用这个session来登陆。
这样的好处是。可以不用把用户的md5密码等信息存在cookie中。
而且,我不知道他怎么实现的,刷新后让$this->user_id不变化,
主要是那个CMS,没有注释,我也看得似懂非懂,自己模仿过来可能有点变味了
 楼主| 发表于 2016-6-14 11:23:43 | 显示全部楼层
Closer 发表于 2016-6-14 10:44
你的檢查方式太過於「特殊」了
尤其這段 :
$result = $this->db->get_where('active_session',array('sess ...

谢谢版主了,我问下,你说的2个问题,安全性漏洞,是说我这种sql查询有问题,还是把sql放在if里面,会有问题呢?
是因为比如sql执行不成功,他会返回错误,这个时候会被if当初true吗?
我刚又去看了下,那个CMS的思路,原来他也是用的session,只是在__construct()里面,又让$this->user_id= session['uid']的值了。
发表于 2016-6-14 12:19:10 | 显示全部楼层
无敌BKB 发表于 2016-6-14 11:23
谢谢版主了,我问下,你说的2个问题,安全性漏洞,是说我这种sql查询有问题,还是把sql放在if里面,会有 ...

我可以本機一直猜測你的 ci_session (暴力破解)
因為是 cookie 紀錄,只要一直更新 cookie 檔就好
運氣好,若取得較高權限者,就可以非法操作了
等同於繞過前面的表單 <form> 檢查

 
发表于 2016-6-15 10:40:11 | 显示全部楼层
本帖最后由 yuzhigang5460 于 2016-6-15 10:53 编辑
无敌BKB 发表于 2016-6-14 10:59
谢谢啊,我是自己参考之前看到的CMS,他是这样处理的。
1、用户登录,校验账号密码正确后,将他的session ...

你的check_login()函数的else语句是不会被命中的。每次刷新网页就是一次新的请求,$user_id的生命期已经结束,固然是不存在值的。所以每次都需要从数据库里把user数据取出来。
这样的好处是。可以不用把用户的md5密码等信息存在cookie中。

你会把密码也存到cookie中?不是这样的,你用php默认的session,密码也不会存到cookie,cookie里只有一个session_id,session_id所对应的session在服务器的session系统里(文件系统或者session数据库)。
PHP复制代码
 
$this->session->set_userdata('user_id', $user['id']); //登陆后设置session
//……………………
$uid = $this->session->userdata('user_id'); //获取uid, uid为空就去登录。
 
复制代码


有兴趣的话,可以看看我写的CI Session系列文章: http://www.ifixedbug.com/posts/how-to-use-codeigniter3-session-1
用户输入密码和口令发送到服务器后,php就会在服务器端生成一个php sessionid和一个具体的数据包放到一个文件中,并存放到指定的文件夹下(如果session.save_handler=files),然后会把sessionId作为一个cookie放到响应中返回给客户端(前提是用户浏览器开启了cookie,否则会加入到url地址的查询字符串中)。用户再次访问服务器上的其他页面时,会把这个phpsessionid的cookie携带上作为请求的一部分发送给服务器,服务器就能根据session id到保存session的文件夹下找到特定的文件,读取其中的数据。


发表于 2016-6-15 18:27:41 | 显示全部楼层
再这里赋值,才能在其他地方调用

PHP复制代码
public function __construct()
    {
        parent::__construct();
$this->user_id = 123;
    }
复制代码

本版积分规则