Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 会话验证将销毁会话_Php_Security_Session_Session Variables - Fatal编程技术网

Php 会话验证将销毁会话

Php 会话验证将销毁会话,php,security,session,session-variables,Php,Security,Session,Session Variables,这是我的课程课程: class Session { const SESSION_VALIDATOR = 'validSession'; /** * Starts the session */ public static function init() { session_start(); if (self::get(self::SESSION_VALIDATOR) !== true) { s

这是我的
课程
课程:

class Session {

    const SESSION_VALIDATOR = 'validSession';

    /**
     * Starts the session
     */
    public static function init() {
        session_start();

        if (self::get(self::SESSION_VALIDATOR) !== true) {
            session_unset();
            session_destroy();
            session_start();
            self::set(self::SESSION_VALIDATOR, true);
        }

        session_regenerate_id(false);
    }

    /**
     * Sets a value in the session
     * 
     * @param string|int $key
     * @param mixed $value
     */
    public static function set($key, $value) {
        $_SESSION[$key] = $value;
    }

    /**
     * Gets a value from the session
     * 
     * @param string|int $key
     * @return mixed
     */
    public static function get($key) {
        if (isset($_SESSION[$key]))
            return $_SESSION[$key];
        else
            return false;
    }

    /**
     * Destroys the session
     */
    public static function destroy() {
        unset($_SESSION);
        session_destroy();
    }

}
class Session {

    const SESSION_STARTED = true;
    const SESSION_NOT_STARTED = false;
    const SESSION_VALIDATOR = 'validSession';

    private $sessionState = self::SESSION_NOT_STARTED;
    private static $instance;

    private function __construct() {

    }

    public static function getInstance() {
        if (!isset(self::$instance)) {
            self::$instance = new self;
        }

        self::$instance->startSession();

        return self::$instance;
    }

    public function startSession() {
        if ($this->sessionState == self::SESSION_NOT_STARTED) {
            $this->sessionState = session_start();
        }

        if (self::get(self::SESSION_VALIDATOR) !== true) {
            $this->destroy();
            session_start();
            self::set(self::SESSION_VALIDATOR, true);
        }

        session_regenerate_id(false);

        return $this->sessionState;
    }

    public function set($name, $value) {
        $_SESSION[$name] = $value;
    }

    public function get($name) {
        if (isset($_SESSION[$name])) {
            return $_SESSION[$name];
        }
    }

    public function __isset($name) {
        return isset($_SESSION[$name]);
    }

    public function __unset($name) {
        unset($_SESSION[$name]);
    }

    public function destroy() {
        if ($this->sessionState == self::SESSION_STARTED) {
            $this->sessionState = !session_destroy();
            unset($_SESSION);

            return !$this->sessionState;
        }

        return false;
    }
}
在随机时间,会话中的
SESSION\u VALIDATOR
变量似乎没有设置,即使它没有更改,并且会话会随机销毁-即使用户登录时也是如此。这是什么原因

更新1:
这似乎只发生在我的本地主机环境(
WAMPServer 2.5
)上,而不是在我的共享主机帐户上

更新2:
它似乎不会发生,因为在意外情况下调用了
Session::destroy()
方法,因为当我在方法内部抛出异常时,在没有抛出异常的情况下发生错误

更新3:
忽略更新#1-这也发生在我的共享托管帐户上

更新4
我尝试了安培的答案,但问题仍然存在。这是新的
课程
课程:

class Session {

    const SESSION_VALIDATOR = 'validSession';

    /**
     * Starts the session
     */
    public static function init() {
        session_start();

        if (self::get(self::SESSION_VALIDATOR) !== true) {
            session_unset();
            session_destroy();
            session_start();
            self::set(self::SESSION_VALIDATOR, true);
        }

        session_regenerate_id(false);
    }

    /**
     * Sets a value in the session
     * 
     * @param string|int $key
     * @param mixed $value
     */
    public static function set($key, $value) {
        $_SESSION[$key] = $value;
    }

    /**
     * Gets a value from the session
     * 
     * @param string|int $key
     * @return mixed
     */
    public static function get($key) {
        if (isset($_SESSION[$key]))
            return $_SESSION[$key];
        else
            return false;
    }

    /**
     * Destroys the session
     */
    public static function destroy() {
        unset($_SESSION);
        session_destroy();
    }

}
class Session {

    const SESSION_STARTED = true;
    const SESSION_NOT_STARTED = false;
    const SESSION_VALIDATOR = 'validSession';

    private $sessionState = self::SESSION_NOT_STARTED;
    private static $instance;

    private function __construct() {

    }

    public static function getInstance() {
        if (!isset(self::$instance)) {
            self::$instance = new self;
        }

        self::$instance->startSession();

        return self::$instance;
    }

    public function startSession() {
        if ($this->sessionState == self::SESSION_NOT_STARTED) {
            $this->sessionState = session_start();
        }

        if (self::get(self::SESSION_VALIDATOR) !== true) {
            $this->destroy();
            session_start();
            self::set(self::SESSION_VALIDATOR, true);
        }

        session_regenerate_id(false);

        return $this->sessionState;
    }

    public function set($name, $value) {
        $_SESSION[$name] = $value;
    }

    public function get($name) {
        if (isset($_SESSION[$name])) {
            return $_SESSION[$name];
        }
    }

    public function __isset($name) {
        return isset($_SESSION[$name]);
    }

    public function __unset($name) {
        unset($_SESSION[$name]);
    }

    public function destroy() {
        if ($this->sessionState == self::SESSION_STARTED) {
            $this->sessionState = !session_destroy();
            unset($_SESSION);

            return !$this->sessionState;
        }

        return false;
    }
}
这使我认为错误出现在
会话\u验证程序
部分:

if (self::get(self::SESSION_VALIDATOR) !== true) {
    $this->destroy();
    session_start();
    self::set(self::SESSION_VALIDATOR, true);
}

,所以我删除了它,现在错误不再发生了。这个会话验证真的有必要吗?为什么?如果保留它是明智的,那么如何解决错误呢?

这是一个设计问题,因为您无意中创建了多个
会话
对象的实例,这些实例对于
会话验证程序
可能具有不同的值

为了避免这个问题,应该在OOP中使用。方法将始终返回相同的实例对象,而不是通过
=newsession
创建实例

您可以尝试此示例来创建一个

更新评论

如果未实例化
会话
对象,则可能会被删除,因为没有对它的引用。因此,
会话验证程序
也被删除。在这种情况下,您将销毁会话(\u unset、\u destroy、\u start),该会话将注销用户

您可以尝试上面的示例,它将通过使用singleton模式来解决问题

然后将整个对象存储为静态值

更新有关
会话验证程序的问题


这是一个设计问题,因为您在服务器端存储的状态取决于客户端的会话状态,即垃圾收集器运行(服务器)或浏览器删除cookie或注销(客户端)

理论上,这意味着HTTP是无状态的,使用会话来解决这个问题。实际上,这意味着您必须从会话中读取一个值,并决定登录是否有效

因此,您的验证必须是一个函数,而不是一个
SESSION\u VALIDATOR
变量,该变量返回一个布尔值,具体取决于会话状态、其值和您的用户数据库,即单例

但是不要在会话中存储login=true之类的内容。使用可通过用户数据库验证的值

还可以查看OWASP

类似问题:


很难说,可能会话是在服务器上被垃圾收集的,或者cookie过期了?这是在用户一段时间没有做任何事情之后发生的吗?还记得会话只保留有限的时间吗?@RiggsFolly有时会在页面立即刷新后发生,但大多数时间都需要一段时间few@Cobra_Fast我如何检查它是否被垃圾收集?页面是否在查看页面一段时间后刷新?如何创建多个
会话的实例?它是一个只有静态方法的类,在脚本的最开始部分,
Session::init()
只被调用一次