我认为我的问题有点奇怪,我写了一个小课程来登录/退出用户,整个系统基于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;
}
}
}
抱歉我的英语。
答案 0 :(得分:0)
对不起我的奇怪问题,但为什么你在历史记录中设置一个cookie(所以它被删除了)然后取消设置一个不存在的cookie?
如果你看一下图像的输出,嗯看起来很奇怪...... 您的服务器的系统时间是多少? 因为它说cookie会在1990年到期。看起来你的计算机/服务器如果仍然有效则落伍了:P
顺便说一下,也许你不能编辑数据,因为你需要首先解码base64加密(因为你在代码中设置它时,你使用base64函数)
答案 1 :(得分:0)
您可以使用无效数据设置Cookie:
setcookie('parsUser', 'trash', time() - 3600);
如果这不删除cookie,它至少应该创建一个无效的登录令牌。
我还建议不要在cookie中使用base64编码用户名和密码。对于经验丰富的攻击者来说,它只是明文。您可以使用mcrypt轻松地将强加密集成到您的应用程序中:
如果这不是一个选项,你可以使用强密钥的xor加密的php-only实现。在互联网上也有php-only的blowfish和Rijndael实现。如果可以,我会提供链接,但我目前的声誉不会让我添加多个超链接。
答案 2 :(得分:0)
尝试在两种情况下设置$ path(创建,删除cookie)