自定义会话处理程序 - 如何正确使用它?

时间:2014-03-21 22:34:25

标签: php security session

在测试时我得到了一些奇怪的结果,我似乎无法弄清楚如何使用它。我有这个自定义会话处理程序:

require_once('database.php');

Class linusLogin_Session {

        private $_database;
        private $_key = '*withheld*';

        public function __construct() {
            $this->_database = new linusLogin_Database;
            session_set_save_handler(
                array($this, "_open"),
                array($this, "_close"),
                array($this, "_read"),
                array($this, "_write"),
                array($this, "_destroy"),
                array($this, "_gc")
                );
            session_name('llSSID');
            session_start();
            }

        public function _open(){
            return TRUE;
            }

        public function _close(){
            return $this->_database->close();
            }

        public function _read($id){
            $data = null;
            $result = $this->_database->selectSessData($id);
            if ($result !== FALSE) {
                $result = $this->_decrypt($result);
                return $result;
                }
            else
                return "";
            }

        public function _write($id, $data){
            $access = time();
            $data = $this->_encrypt($data);
            $result = $this->_database->replaceSessData($id, $access, $data);
            }

        public function _destroy($id){
            return $this->_database->destroySessData($id);
            }

        public function _gc($max){
            $old = time() - $max;
            return $this->_database->gCollectSessData($old);
            }

        private function _encrypt($data) {
                *encryption withheld*
                return $data;
            }

        private function _decrypt($data) {
                *decryption withheld*
                return $data;
            }

        public function setKey($key) {
                $this->_key = $key;
                }
        }
    $session = new linusLogin_Session;

那么,我是否正确将文件实例化为自己的类(最后一行)?或者,当我使用session_start()时,类是否会实例化?我在构造中有session_start(),我希望它是所有文档中唯一存在的地方 - 这是一个好的做法吗?我之前遇到过这个处理程序的麻烦,因为在页面上没有使用session_start(),即使它在处理程序中。 (我真的很讨厌那些说出来的通知

  已调用

session_start(),忽略session_start()

作为一个附带问题 - 我一直听到我应该重新生成session id每个请求 - 但请求意味着什么?这是否意味着每个http请求或这是否意味着会话中的每个更改?重新生成id的最佳做法是什么(不使用“每个请求”行)。

此外,任何有关安全性的建议都会很棒。

1 个答案:

答案 0 :(得分:0)

自定义会话处理程序由PHP的会话代码使用。它是一个被采取行动的对象,而不是演员。因此,您应该只定义自定义方法,然后在其他地方启动会话。

例如:

// Make sure you make changes like this one:
Class linusLogin_Session implements SessionHandlerInterface {

// This doesn't need to do anything with session config or call any session_* functions
    public function __construct() {
        $this->_database = new linusLogin_Database;
    }
}

然后......

include "mysessionhandler.php";
$session = new linusLogin_Session();
session_set_save_handler($session);
session_name('llSSID');
session_start();
// The rest of your site goes here