Вход с использованием базы данных сессий? - PullRequest
0 голосов
/ 06 сентября 2011

Я пытался заставить мой скрипт входа работать с сеансами, управляемыми базой данных.

Это мой класс сеанса базы данных:

class SessionManager {
    var $life_time;

    function SessionManager() {
        // Read the maxlifetime setting from PHP
        $this->life_time = 600; //10 minutes

        // Register this object as the session handler
        session_set_save_handler(array( &$this, "open" ), 
                                 array( &$this, "close" ),
                                 array( &$this, "read" ),
                                 array( &$this, "write"),
                                 array( &$this, "destroy"),
                                 array( &$this, "gc" )
                                 );
   }

    function open( $save_path, $session_name ) {
        global $sess_save_path;

        $sess_save_path = $save_path;
        // Don't need to do anything. Just return TRUE.
        return true;
    }

    function close() {
        return true;
    }

    function read( $id ) {
        // Set empty result
        $data = '';

        // Fetch session data from the selected database
        $time = time();

        $newid = mysql_real_escape_string($id);
        $sql = "SELECT 
                    `session_data` 
                FROM 
                    `sessions` 
                WHERE 
                    `session_id` = '$newid' 
                AND 
                    `session_expire` > $time";

        $rs = mysql_query($sql);                           
        $a = mysql_num_rows($rs);

        if($a > 0) {
            $row = mysql_fetch_assoc($rs);
            $data = $row['session_data'];
        }

        return $data;
    }

    function write($id, $data) {
            // Build query                
            $time = time() + $this->life_time;

            $newid = mysql_real_escape_string($id);
            $newdata = mysql_real_escape_string($data);

            $sql = "INSERT INTO `sessions` (`session_id`, `session_data`, 
                                              `session_expire`, `session_agent`, 
                                              `session_ip`) 
                                            VALUES
                                            (\"".$id."\", \"".$data."\",
                                             \"".time()."\",\"".$_SERVER['HTTP_USER_AGENT']."\",
                                             \"".$_SERVER['REMOTE_ADDR']."\")
                                            ON DUPLICATE KEY UPDATE 
                                            `session_id` = \"".$id."\",
                                            `session_data` = \"".$data."\",
                                            `session_expire` = \"".time()."\"";

            $rs = mysql_query($sql) or die(mysql_error());

            return true;
    }

    function destroy($id) {
        // Build query
        $id = mysql_real_escape_string($id);
        $sql = "DELETE FROM `sessions` WHERE `session_id`='$id'";
        mysql_query($sql);

        return true;
    }

    function gc(){
        // Garbage Collection
        // Build DELETE query.  Delete all records who have passed the expiration time
        $sql = 'DELETE FROM `sessions` WHERE `session_expire` < UNIX_TIMESTAMP();';
        mysql_query($sql);

        // Always return TRUE
        return true;
    }
}

Это часть моего класса входа в систему:

function process_login(){
        global $mysql_prefix;

        $email = mysql_real_escape_string($_POST['email']);
        $check = mysql_query("SELECT password,salt,id FROM ".$mysql_prefix."users WHERE email='$email'");

        if(mysql_num_rows($check) > 0){
            $info = mysql_fetch_assoc($check);
            $private_key = $this->get_secret_key();
            $password = hash('sha256', $info['salt'] . hash('sha256', $private_key.$_POST['password']));

            if($password == $info['password']){
                $_SESSION[$this->user_session]['id'] = $info['id'];

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

Мне понадобился класс сеанса в моем файле global.php, и я назвал его (или как он там называется), но как мне на самом деле использовать эту новую систему сеансов базы данных с моим текущим классом входа в систему?

Я пытался использовать $ManageSessions->write(id, data) так:

function process_login(){
        global $mysql_prefix;

        $email = mysql_real_escape_string($_POST['email']);
        $check = mysql_query("SELECT password,salt,id FROM ".$mysql_prefix."users WHERE email='$email'");

        if(mysql_num_rows($check) > 0){
            $info = mysql_fetch_assoc($check);
            $private_key = $this->get_secret_key();
            $password = hash('sha256', $info['salt'] . hash('sha256', $private_key.$_POST['password']));

            if($password == $info['password']){
                $SessionManager->write(session_id(),$info['id']);

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

Но, похоже, это не работает, и данные перезаписываются, как только страница обновляется.

Я, должно быть, упускаю что-то очевидное или просто кодирую что-то не так.

(Мне известны недостатки безопасности в скрипте, и я нахожусь в процессе его доработки, поэтому, пожалуйста, не говорите ничего о безопасности или о чем-то подобном. Спасибо :))

1 Ответ

4 голосов
/ 06 сентября 2011

Приведенный выше класс заменяет сессионную систему php на систему класса.Когда вы создаете новый экземпляр класса, вызывается его конструктор (function SessionManager() {), который устанавливает функции в классе для запуска вместо значений по умолчанию в php.Так что теперь, когда вы записываете что-то в $_SESSION, он использует функции записи SessionManager, которые добавляют его в базу данных.

Итак, в основном, просто инициализируйте этот класс на каждой странице, а затем используйте ваши сеансы, как обычнобыло бы.Они все просто появятся в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...