Seite 1 von 1

Thema Sessions

Verfasst: 08.10.2002 13:22
von Thies
Hi Leutz,

ich wollte mich mal etwas näher mit dem Thema Sessions beschäftigen, da manchmal Cookies auf fremden Rechnern stark eingeschränkt sind. Aber irgendwie komme ich nicht weiter. Ich habe ein Lib zum Thema Sessions gefunden, ich bin mal so frech und poste die hier. Was ich nämlich leider gar nicht verstehe, ist wie ich die nutzen kann? Was muss ich machen, um diese Lib in mein Script einzubauen? Und wie kann man prüfen, ob Cookies genommen werden oder nicht?

Ich bin nämlich noch Anfänger in Sachen PHP und arbeite mich so langsam ein.

Hier der Code:

Code: Alles auswählen

<?php
// +--------------------------------------------------------------------------+
// | dbSessions version 0.1.2 - 2002/02/15                                    |
// +--------------------------------------------------------------------------+
// | Copyright (c) 2000-2001 The phpHeaven-team                               |
// +--------------------------------------------------------------------------+
// | License:  GNU/GPL - http://www.gnu.org/copyleft/gpl.html                 |
// +--------------------------------------------------------------------------+
// | Library that allows to use sessions with any version of PHP,             |
// | with many storage abilities                                              |
// |                                                                          |
// | usage:    - include this library in your files before any call to        |
// |             function 'session_start()'                                   |
// |           - create a table with 3 fields like the following :            |
// |               CREATE TABLE table_name                                    |
// |               (                                                          |
// |                   id    CHAR(32)    NOT NULL PRIMARY KEY,                |
// |                   last  INTEGER     NOT NULL,                            |
// |                   vars  TEXT                                             |
// |               );                                                         |
// |           - configure database access with constants at the beginning    |
// |           - PHP3 users, remember to call 'session_save()' function at    |
// |             the end of any script that uses sessions                     |
// |           - PHP4 users, verify that the 'session.save_handler' directive |
// |             of your 'php.ini' file is set to 'user'                      |
// |                                                                          |
// | required: - PHP                                                          |
// |           - dbMysql, database abstraction library available on phpHeaven |
// |                                                                          |
// | to do:    - use PEAR DB                                                  |
// |                                                                          |
// | changes:                                                                 |
// |           version 0.1.2 - 2002/02/15                                     |
// |             Nicolas Hoizey                                               |
// |             - bugfix: didn't work when using dbMysql with a fetchmode    |
// |               different of MYSQL_ASSOC                                   |
// |             - bugfix: replaced $var by $GLOBALS[$var] in session_register|
// |           version 0.1.1 - 2001/07/16                                     |
// |             Benjamin Sonntag                                             |
// |             - bugfix: 'data' replaced by 'vars' in table definition to   |
// |               avoid problem with old versions of MySQL in which 'data'   |
// |               is a restricted keyword                                    |
// |             - bugfix: now tests for registered variables in session      |
// |               before trying to use any                                   |
// |             Nicolas Hoizey                                               |
// |             - change: added a return in PHP4's 'session_save()' function |
// |             - PEAR style header                                          |
// +--------------------------------------------------------------------------+
// | Last release available on phpHeaven:                                     |
// |    <a href="http://www.phpheaven.net/resources/libraries/dbSessions/" target="_blank">http://www.phpheaven.net/resources/...ies/dbSessions/</a>              |
// |                                                                          |
// | Authors:  Nicolas Hoizey <nhoizey@phpheaven.net>                         |
// |           Benjamin Sonntag <benjamin@octopuce.com>                       |
// +--------------------------------------------------------------------------+

if(!defined('_LIB_DBSESSIONS_LOADED'))
{
    define('_LIB_DBSESSIONS_LOADED', true);

    //  ######################################################
    // ##### Manual configuration needed ####################
    //  ######################################################
    // Define database parameters
    define('_LIB_DBSESSIONS_DBHOST', 'database_host');
    define('_LIB_DBSESSIONS_DBNAME', 'database_name');
    define('_LIB_DBSESSIONS_DBUSER', 'database_user');
    define('_LIB_DBSESSIONS_DBPASS', 'database_user_password');
    define('_LIB_DBSESSIONS_TABLE', 'table_name');

    if(floor(phpversion()) < 4)    {
        // Session life time in seconds (1 hour by default)
        define('_LIB_DBSESSIONS_LIFETIME', 60*60);
        // Garbage collector probability (1 by default, always)
        define('_LIB_DBSESSIONS_GC_PROBABILITY', 1);
    //  ######################################################
    // #### End of manual configuration #####################
    //  ######################################################
    } else {
        // Get parameters  from configuration file 'php.ini'
        // Session life time
        define('_LIB_DBSESSIONS_LIFETIME', get_cfg_var('session.gc_maxlifetime'));
        // Garbage collector probability
        define('_LIB_DBSESSIONS_GC_PROBABILITY', get_cfg_var('session.gc_probability'));
    }

    // includes database abstraction class
    define('_DBMYSQL_FETCH_MODE', MYSQL_ASSOC);
    require 'db.lib.php';

    // new database handler
    $sessionDbLink = new DB(_LIB_DBSESSIONS_DBHOST, _LIB_DBSESSIONS_DBNAME, _LIB_DBSESSIONS_DBUSER, _LIB_DBSESSIONS_DBPASS);

    // random initialization
    srand((double)microtime()*1000000);
    
    if(floor(phpversion()) < 4) {
        //  ######################################################
        // ##### Code for PHP3 ##################################
        //  ######################################################
        
        function session_start()
        {
            global $sessionDbLink;
            if(isset($GLOBALS['PHPSESSID'])) {
                define('PHPSESSID', $GLOBALS['PHPSESSID']);
                if($serialized = $sessionDbLink->queryOneRecord("SELECT vars FROM "._LIB_DBSESSIONS_TABLE." WHERE id = '".PHPSESSID."'")) {
                    $data = unserialize(stripslashes($serialized['vars']));
                    if (is_array($data)) {
                        $GLOBALS[] = $data;
                        while(list($key, $value) = each($data)) {
                            $GLOBALS['phpSessionsVars'][$key] = $key;
                        }
                    }
                }
            } else {
                define('PHPSESSID', uniqid('dbSessions'.time()));
                $GLOBALS['phpSessionsVars'] = array();
            }
            setcookie('PHPSESSID', PHPSESSID, time() + _LIB_DBSESSIONS_LIFETIME);
            
            // garbage collection
            if(rand() <= _LIB_DBSESSIONS_GC_PROBABILITY) {
                $sessionDbLink->query("DELETE FROM "._LIB_DBSESSIONS_TABLE." WHERE last < ".(time() - _LIB_DBSESSIONS_LIFETIME));
            }
        }
    
        function session_id()
        {
            return PHPSESSID;
        }
        
        function session_register($var)
        {
            if(!isset($GLOBALS['phpSessionsVars'][$var])) {
                $GLOBALS['phpSessionsVars'][$var] = $GLOBALS[$var];
            }
        }
        
        function session_unregister($var)
        {
            if(isset($GLOBALS['phpSessionsVars'][$var])) {
                $GLOBALS['phpSessionsVars'][$var] = '';
            }
        }
        
        function session_is_registered($var)
        {
            return isset($GLOBALS['phpSessionsVars'][$var]);
        }
        
        function session_destroy()
        {
            global $sessionDbLink;
            setcookie('PHPSESSID', '');
            $sessionDbLink->query("DELETE FROM "._LIB_DBSESSIONS_TABLE." WHERE id = '".PHPSESSID."'");
            unset($GLOBALS['phpSessionsVars']);
            unset($GLOBALS['PHPSESSID']);
        }

        // just needed for PHP3
        function session_save()
        {
            global $sessionDbLink;
            $data = array();
            if (is_array($GLOBALS['phpSessionsVars'])) {
                while(list($key, $key2) = each($GLOBALS['phpSessionsVars'])) {
                    if($key2 != '') $data[$key] = $GLOBALS[$key];
                }
            }
            $serialized = addslashes(serialize($data));
            $nb = $sessionDbLink->queryOneRecord("SELECT COUNT(*) AS nb FROM "._LIB_DBSESSIONS_TABLE." WHERE id = '".PHPSESSID."'");
            $nb = $nb['nb'];
            if ($nb == 0) {
                $sessionDbLink->query("INSERT INTO "._LIB_DBSESSIONS_TABLE." (id, last, vars) VALUES ('".PHPSESSID."', ".time().", '".$serialized."')");
            } else {
                $sessionDbLink->query("UPDATE "._LIB_DBSESSIONS_TABLE." SET vars = '".$serialized."', last = ".time()." WHERE id = '".PHPSESSID."'");
            }
            
            return true;
        }
    } elseif(get_cfg_var('session.save_handler') == 'user') {
        //  ######################################################
        // ##### Code for PHP4 ##################################
        //  ######################################################
        
        function sessionOpen($savePath, $sessionName)
        {
            return true;
        }
    
        function sessionClose()
        {
            return true;
        }
    
        function sessionRead($id)
        {
            global $sessionDbLink;
    
            $id = addslashes($id);
            $data = $sessionDbLink->queryOneRecord("SELECT vars FROM "._LIB_DBSESSIONS_TABLE." WHERE id = '".$id."'");
            $data = $data['vars'];
            if(strlen($data) > 0) {
                return $data;
            } else {
                return false;
            }
        } 
        
        function sessionWrite($id, $data)
        {
            global $sessionDbLink;
            
            $id = addslashes($id);
            $data = addslashes($data);
            $nb = $sessionDbLink->queryOneRecord("SELECT COUNT(*) AS nb FROM "._LIB_DBSESSIONS_TABLE." WHERE id = '".$id."'");
            $nb = $nb['nb'];
            if ($nb == 0) {
                $sessionDbLink->query("INSERT INTO "._LIB_DBSESSIONS_TABLE." (id, last, vars) VALUES ('$id', ".time().", '$data')");
            } else {
                $sessionDbLink->query("UPDATE "._LIB_DBSESSIONS_TABLE." SET vars = '$data', last = ".time()." WHERE id = '$id'");
            }
            
            return true;
        }
        
        function sessionDestroy($id)
        {
            global $sessionDbLink;
            
            $id = addslashes($id);
            $ret = $sessionDbLink->query("DELETE FROM "._LIB_DBSESSIONS_TABLE." WHERE id = '".$id."'");
            
            return $ret;
        }
        
        function sessionGarbageCollector($sessionLifeTime)
        {
            global $sessionDbLink;
            
            $ret = $sessionDbLink->query("DELETE FROM "._LIB_DBSESSIONS_TABLE." WHERE last < ".(time() - _LIB_DBSESSIONS_LIFETIME));
            
            return $ret;
        }
        
        function session_save()
        {
            // just a trick to allow seamless migration from PHP3 to PHP4
            return true;
        }
        
        session_set_save_handler('sessionOpen', 'sessionClose', 'sessionRead', 'sessionWrite', 'sessionDestroy', 'sessionGarbageCollector' );
    }
}
?>
Worum geht es mir genau? Ich habe auf meiner Website einen Admin-Bereich, die Login-Daten werden im Cookie gespeichert. Anhand des gespeicherten Usernamen werden die Rechte aus der MySQL-DB abgefragt. Ganz klassisch also :) Nun arbeite ich hin und wieder an fremden Rechnern, die eine sehr hohe Sicherheitseinstellung haben, an der ich keinerlei Änderungen vornehmen kann und wo gar keine Cookies gespeichert werden. Damit bekomme ich keinen Zugriff. Beim phpBB funktioniert das ja trotzdem, weil auch eine Session-Nutzung eingebaut ist und das möchte ich nun gern auch erreichen.

Danke für Eure Hilfe!

Frank-Andre

Verfasst: 08.10.2002 14:50
von itst

Verfasst: 08.10.2002 15:43
von Thies
Hi,

Danke für den Hinweis, aber ich steige da nicht durch. Das hatte ich mir durchgelesen, aber ehrlich gesagt nicht verstanden. Deswegen hatte ich gehofft, dass mir hier jemand weiterhelfen kann.

CU

Frank-Andre

Verfasst: 08.10.2002 15:46
von itst

Verfasst: 08.10.2002 17:31
von Thies
Super, dort ist das wirklich gut erklärt. Das schaue ich mir mal in Ruhe an. Mein Hauptproblem ist dann nur noch, wie ich anstelle der internen PHP-Sessions das o.g. Script mit der MySQL-DB nutze und wie ich einen parallelen Betrieb von Cookies und Sessions hinbekomme. So auf die Art, wenn Cookies nicht geht, dann Sessions. Aber vielleicht helfen mir dafür schon der Link weiter.

Danke dafür.

Frank-Andre

Verfasst: 09.10.2002 12:07
von Thies
Ich wollte nur kurz mitteilen, dass mir die Links sehr gut weitergeholfen haben und das mit der Sessions-Umstellung geklappt hat.

Dafür ein dickes Danke schön!

CU

Frank-Andre

Verfasst: 09.10.2002 14:28
von itst
Bitte schön :D