无法使用php删除用户类中的cookie

时间:2009-11-08 12:09:54

标签: php class session cookies

我认为我的问题有点奇怪,我写了一个小课程来登录/退出用户,整个系统基于MVC模式,我的库是自定义和自编写的, 但问题是:当我用$ remember标志登录用户时,没有问题,会话很容易设置和取消设置。但是当我激活$ remember并且我创建一个cookie时,我的注销功能不起作用,它会删除会话但不会删除cookie,因此cookie会保留在浏览器中并显示完整的数据,每当我重新加载页面时,我的班级都会记录下来再次,因为有一个cookie具有完整的身份验证详细信息,问题是cookie,我无法发送其他标题,如位置:blah blah from $ this-> logout;香港专业教育学院尝试了不同的方法来取消cookie,但没有运气; 这是班级:

<?php
/**
 * Pars----
 * Classified --- Application
 *
 * @author Sallar Kaboli (me@sallar.ir)
 * @copyright Copyright (C) 2009 - 2010 -----CO (dev@------.us)
 * @package Pars---
 * @version 1.0
 */

class ParsUser {

    public $userID = false;

    private $_p = null;
    public $userData = null;

    public function __construct() {
        $this->_p = ParsRegistry::getInstance();
        if( $this->_p->sess->isVarSet('parsUser') ) {
            $this->loadUser($this->_p->sess->getVar('parsUser'));
        }

        if( isset($_COOKIE['parsUser']) and !$this->isLoggedIn() ) {
            $userFromCookie = unserialize(base64_decode($_COOKIE['parsUser']));
            $this->checkLogin($userFromCookie['username'], $userFromCookie['password'], true, false);
        }
    }

    public function checkLogin($username, $password, $remember = true, $hash = true) {

        if(!empty($username) and !empty($password)) {

            $password = $hash ? $this->_p->valid->hash($password) : $password;
            $qData = array('user' => $username, 'pass' => $password);
            $query = 'SELECT * FROM people WHERE `username` = :user AND `password` = :pass';

            $user = $this->_p->db->getRow($query, $qData);

            if(is_object($user) AND !empty($user->id)) {

                $this->userID = $user->id;
                $this->userData = $user;

                if( $hash ) {
                    $this->_p->db->execute('UPDATE people SET `last_login` = ? WHERE `id` = ?', array( time(), $this->userID ));
                }

                $this->loginTheUser($remember);
                return true;

            }
            else {
                return false;
            }
        }
        else {
            return false;
        }
    }

    private function loginTheUser($remember = true) {
        $this->_p->sess->setVar('parsUser', $this->userID);

        if( $remember ){
            $rememberPeriod = $this->_p->conf->c['cookie_remember_period'];
            $cookie = array(
                      'username' => $this->userData->username,
                      'password' => $this->userData->password
                      );

            $cookie = base64_encode(serialize($cookie));
            setcookie('parsUser', $cookie, time() + $rememberPeriod/*, '/', $_SERVER['HTTP_HOST']*/);
        }
        return false;
    }

    private function loadUser($userID){

        $user = $this->_p->db->getRow('SELECT * FROM people WHERE `id` = ?', $userID);

        if( is_object($user) and ( $user->id == $userID ) ){

            $this->userID = $user->id;
            $this->userData = $user;
            $this->_p->sess->setVar('parsUser', $this->userID);

            return true;
        }
        else return false;

    }

    public function logout($redirectTo = false) {
        setcookie('parsUser', '', mktime(12,0,0,1, 1, 1990));
        unset($_COOKIE['parsUser']);
        $this->_p->sess->sessionDrop();
        $this->userData = null;
        $this->userID = false;

        if ( !empty($redirectTo) ){
               $this->_p->core->redirect($redirectTo);
               exit;
            }
    }

    public function isLoggedIn() {
        //return ( empty($this->userID) OR !$this->userID ) ? false : true;

        if( $this->userID > 0 and $this->userID != false and !empty($this->userID) )
            return true;
        else return false;
    }

    public function checkAccess($level) {
        if($level == 0) {
            return true;
        }
        elseif($this->isLoggedIn()) {
            if( $this->userData->level <= $level ) {
                return true;
            }
            else {
                return false;
            }
        }
        else {
            return false;
        }
    }

    public function getUserData() {

        $args = func_get_args();

        if( empty($this->userID) )
           throw new Exception('User is not loaded.');

        if( is_array($args) and count($args) > 0){
            foreach( $args as $arg ){
                if( !isset($this->userData->$arg) )
                    throw new Exception('Unknown property: <b>' . $property . '</b>');
                else
                    $props[$arg] = $this->userData->$arg;
            }

            if( count($args) == 1 )
                return $props[$args[0]];
            else
                return $props;
        }
        else{
            $props = $this->userData;
            unset($props->password);
            return $props;
        }

    }


}
抱歉我的英语。

3 个答案:

答案 0 :(得分:0)

对不起我的奇怪问题,但为什么你在历史记录中设置一个cookie(所以它被删除了)然后取消设置一个不存在的cookie?

如果你看一下图像的输出,嗯看起来很奇怪...... 您的服务器的系统时间是多少? 因为它说cookie会在1990年到期。看起来你的计算机/服务器如果仍然有效则落伍了:P

顺便说一下,也许你不能编辑数据,因为你需要首先解码base64加密(因为你在代码中设置它时,你使用base64函数)

答案 1 :(得分:0)

您可以使用无效数据设置Cookie:

setcookie('parsUser', 'trash', time() - 3600);

如果这不删除cookie,它至少应该创建一个无效的登录令牌。

我还建议不要在cookie中使用base64编码用户名和密码。对于经验丰富的攻击者来说,它只是明文。您可以使用mcrypt轻松地将强加密集成到您的应用程序中:

http://us2.php.net/mcrypt

如果这不是一个选项,你可以使用强密钥的xor加密的php-only实现。在互联网上也有php-only的blowfish和Rijndael实现。如果可以,我会提供链接,但我目前的声誉不会让我添加多个超链接。

答案 2 :(得分:0)

尝试在两种情况下设置$ path(创建,删除cookie)