Thema Sessions

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Thies
Mitglied
Beiträge: 106
Registriert: 01.07.2002 15:58
Wohnort: Thüringen
Kontaktdaten:

Thema Sessions

Beitrag 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
"credendo vides"
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag von itst »

Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Thies
Mitglied
Beiträge: 106
Registriert: 01.07.2002 15:58
Wohnort: Thüringen
Kontaktdaten:

Beitrag 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
"credendo vides"
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag von itst »

Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Thies
Mitglied
Beiträge: 106
Registriert: 01.07.2002 15:58
Wohnort: Thüringen
Kontaktdaten:

Beitrag 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
"credendo vides"
Thies
Mitglied
Beiträge: 106
Registriert: 01.07.2002 15:58
Wohnort: Thüringen
Kontaktdaten:

Beitrag 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
"credendo vides"
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag von itst »

Bitte schön :D
Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Antworten

Zurück zu „Coding & Technik“