carsten schlichting: session_id($_GET[session_name()])

Hallo

habt ihr das schon einmal gesehen:

session_id($_GET[session_name()]);

habe dies auch nicht so im php_manual gefunden.

Vielleicht weiß ja jemand von Euch, was durch die Funktion in php geschieht.[versuche gerade die Session im osCommerce_Shop zu verstehen.]

also grüße

carsten

  1. Hallo,

    lös es auf!

    session_id($_GET[session_name()]);

    $name = session_name();

    echo $name;

    $get  = $_GET[$name];

    echo $get;

    $id = session_id($get);

    echo $id;

    Die HTML-Darstellung musst Du bitte selber einbauen.

    LG
    Chris

    1. Moin!

      session_id($_GET[session_name()]);

      Ein leicht sinnloses Konstrukt, würde ich meinen!

      $name = session_name();

      In session_name() steht drin, wie der Parameter heißt, der in $_GET, $_POST oder $_COOKIES verwendet wird, um die Session-ID zurückzusenden.

      $get  = $_GET[$name];

      Damit wird auf die per GET übermittelte Session-ID zugegriffen.

      $id = session_id($get);

      Und das setzt die Session-ID auf die per GET übermittelte Session-ID.

      Damit diese Vorgehensweise sinnvoll ist, müssen bestimmte Umgebungsbedingungen erfüllt sein - denn normalerweise erledigt PHP das Ermitteln der Session-ID basierend auf dem aktuellen Session-Namen vollautomatisch, wobei die Priorität allerdings auf $_COOKIES liegt, nicht auf $_GET. Der Code würde also diese Priorität verändern, wenn zwei unterschiedliche Session-IDs übermittelt werden.

      - Sven Rautenberg

      --
      My sssignature, my preciousssss!
      1. Hallo Sven,

        session_id($_GET[session_name()]);

        Ein leicht sinnloses Konstrukt, würde ich meinen!

        Wenn man es genau getrachtet, schon. Nur dazu muss man es doch erst einmal genau betrachten. Mein Zerlegungsvorschalg hat also durchaus einen Hintergrund gehabt.

        Dieses Kontrukt stellt eine Emulation dessen dar, was PHP ohnehin schon automatisch macht, um die Session-ID zu ermitteln, die verwendet werden würde, wenn session_start() oder eine andere Funktion mit implizitem Session-Start aufgerufen würde.

        Der Nachteil der vom OP geposteten Zeile steckt aber in NOTICE.
        Es wird nämlich ggf. auf Parameter zugegriffen, die gar nicht existieren!

        LG
        Chris

    2. Hi danke schon einmal

      hier der ganze code_Zusammenhang

      es handelt sich um eine Session-class, die externe scripte für den oscommerce_Shop ermöglichen soll.

      funktioniert super mit cookies, aber nicht so richtig, wenn cookis disabled sind.

      versuch ich gerade herauszufinden, woran das liegen könnte?

      ---------------------------------------------

      //// Initialize the class
      $SessClass = new Session();

      ---->kapier ich

      //// Set the session handlers
      // NOTE: the class is passed by reference!
      session_set_save_handler (array(&$SessClass, '_open'),
                                array(&$SessClass, '_close'),
                                array(&$SessClass, '_read'),
                                array(&$SessClass, '_write'),
                                array(&$SessClass, '_destroy'),
                                array(&$SessClass, '_gc'));

      --->kapier ich: mit Hilfe der Klasse und session_set_save_handler wird die session in der MySQL_datenbank abgelegt und bearbeitet.

      //// Set the session name
      session_name('osCsid');

      -->kapier ich

      //// Simple logic to see if the osCsid is passed via GET or POST
      if (isset($_POST[session_name()])) {
       session_id($_POST[session_name()]);
      } elseif ( isset($_GET[session_name()]) ) {
       session_id($_GET[session_name()]);
      }

      --> kapier ich nicht richtig:  wird hier eventuell die session_id überschrieben, wenn eine session_Id im Zusammenhang mit dem Session_Namen=osCsid vorhanden ist. und zwar mit dieser übermittelten session_id.
      was passiert, wenn ocsid = übermittelte session_id
      nicht als Session abgespeicherrt ist.--> session_start() öffnet eine neue Session.--stimmt das?

      //// If the visitor has cookies disabled and the osCsid is set via GET or POST
      // start the output buffer and rewrite the page links / forms
      if ( !isset($_COOKIE[session_name()]) && ( isset($_GET[session_name()]) || isset($_POST[session_name()]) ) ){
       output_add_rewrite_var(session_name(), session_id());
      }

      --->kapier ich ???  : wenn eine session per get oder post  und nicht über cookis übermittelt wird, wird in php die Funktion eingschaltet, die die session_id an die hrefs anhängt. bei js script - aber - muß die session_id "manuell" angefügt werden

      //// Finally, start the session
      session_start();

      --> hier wird dann auch überprüft, ob die seesion_id vorhanden ist?--falss nicht , wird eine neue session ausgegeben.-->kapier ich also ;-)

      aber woran könnte es noch liegen, dass wenn cookies disabled sind die SESSION nicht richtig funktionieren..., obwohl ich in den js_funktionen den session_name =session_id angehängt habe.

      probier es jetzt nocheinmal mit der konstante sid.

      und dann mal sehen.

      grüße carsten

      1. Hallo Carsten,

        ich habe hier den Eindruck, dass OSCommerce an dieser Stelle noch Code benutzt, der von Anno Knölf stammt und den nur mäßig renoviert hat.

        Außerdem habe ich den Eindruck, dass Sven Dir das gleiche sagen wollte...

        Beschäftige Dich zum Verständnis dringend erst einmal mit der aktullen Session-Behandlung von PHP und den dazu möglichen Voreinstellungen. Außerdem sit der Übergang von "register_globals=on" zu "register_globals=OFF" für Dich ein wichtiges Thema. PHP hat da viele Automatismen der Anfangszeit, die nicht wirklich hilfreich waren, durch bessere Konzepte ersetzt.

        Ich weiß aus eigener Erfahrung der letzten zwei Jahre, wie nervig es sein kann, "gut gfunktionierende" Scripte der Vergangenheit auf einen  neuen, meistens sichereren Level umzuschreiben. Insbedondere dann, wenn die alten Scripte nicht vollständig dokumentiert waren.

        LG
        Chris

        1. Hallo

          Beschäftige Dich zum Verständnis dringend erst einmal mit der aktullen Session-Behandlung von PHP und den dazu möglichen Voreinstellungen.

          meinst du session.auto_start

          Außerdem ist der Übergang von "register_globals=on" zu "register_globals=OFF" für Dich ein wichtiges Thema. PHP hat da viele Automatismen der Anfangszeit, die nicht wirklich hilfreich waren, durch bessere Konzepte ersetzt.

          das habe ich schon versucht zu berücksichtigen-> habe sicherheitshalber alle meine benutzen variablen zu beginn definiert, weil bei meinem Provider höchstwahrscheinlich trotzdem register_globals auf on steht.

          was meinst du konkret, was an der session hier  falsch oder veraltet ist?

          also dankeschön und

          grüße von mir carsten

      2. Hallo

        habe gedacht ich poste auch mal die Klasse, damit alles für das archiv vollständig ist und jemand mal etwas damit anfangen könnte, wenn er draufstößt.

        aber eines kommt mir ganz komisch vor. warum steht die klassen_definition am Ende des scripts??

        kann der Klassenaufruf am anfang des scriptes da überhaupt wirken?

        also grüße und hier die Klasse:

        <?php /**  * osC External Sessions  *  * This class was developed in response to a need to maintain active sessions  * external to the osCommere store area.  The utility of this class is to allow  * active sessions (USING MYSQL DATABASE STORAGE) anywhere on a PHP based site.  *  * @package osC-External-Sessions  * @license http://opensource.org/licenses/gpl-license.php GNU Public License  * @version 1.0  * @link http://www.oscommerce-freelancers.com/ osCommerce-Freelancers  * @copyright Copyright 2005, Bobby Easland  * @author Bobby Easland  * @filesource  */

        //// Initialize the class $SessClass = new Session();

        //// Set the session handlers // NOTE: the class is passed by reference! session_set_save_handler (array(&$SessClass, '_open'),                           array(&$SessClass, '_close'),                           array(&$SessClass, '_read'),                           array(&$SessClass, '_write'),                           array(&$SessClass, '_destroy'),                           array(&$SessClass, '_gc'));

        //// Set the session name session_name('osCsid');

        //// Simple logic to see if the osCsid is passed via GET or POST if (isset($_POST[session_name()])) {  session_id($_POST[session_name()]); } elseif ( isset($_GET[session_name()]) ) {  session_id($_GET[session_name()]); }

        //// If the visitor has cookies disabled and the osCsid is set via GET or POST // start the output buffer and rewrite the page links / forms if ( !isset($_COOKIE[session_name()]) && ( isset($_GET[session_name()]) || isset($_POST[session_name()]) ) ){  output_add_rewrite_var(session_name(), session_id()); }

        //// Finally, start the session session_start();

        /**  * osC External Sessions  *  * The Session class provides abstraction so osC session data can be accessed external to the  * store area.  Currently, the class ONLY supports MySQL storage/access of sessions so if  * you use the filesystem to store sessions THIS CLASS WILL NOT WORK FOR YOU.  * @package osC-External-Sessions  * @license http://opensource.org/licenses/gpl-license.php GNU Public License  * @version 1.0  * @link http://www.oscommerce-freelancers.com/ osCommerce-Freelancers  * @copyright Copyright 2005, Bobby Easland  * @author Bobby Easland  / class Session{  /*   * $session_table is the database table used to store session data.  This is set as the defined constant in includes/database_tables.php  * @var string   /     var $session_table;  /*   * $connection is the method used to store session data.  Currently, the only supported method is "mysql".  * @var string   /     var $connection;  /*   * $db_host is the database host setting which is set by the defined constant in includes/configure.php  * @var string   /     var $db_host;  /*   * $db_use is the database user setting which is set by the defined constant in includes/configure.php  * @var string   /     var $db_user;  /*   * $db_pass is the database password setting which is set by the defined constant in includes/configure.php  * @var string   /     var $db_pass;  /*   * $db_dbase is the database name setting which is set by the defined constant in includes/configure.php  * @var string   /     var $db_dbase;  /*   * $DB is the database object  * @var object   /  var $DB;  /*   * $session_lifetime is the session lifetime value: default 1440  * @var integer   */  var $session_lifetime;

        /**  * Session class constructor  * @author Bobby Easland  * @version 1.0  * @param string $server Database server / host  * @param string $username Database username  * @param string $database Database name  * @param string $password Database password  */  function Session($server = DB_SERVER, $username = DB_SERVER_USERNAME, $database = DB_DATABASE, $password = DB_SERVER_PASSWORD){   $this->db_dbase = $database;   $this->db_user = $username;   $this->db_pass = $password;   $this->db_host = $server;   $this->session_table = defined('TABLE_SESSIONS') ? TABLE_SESSIONS : 'sessions';   $this->connection = defined('STORE_SESSIONS') ? STORE_SESSIONS : 'mysql';   if ($this->connection == 'mysql'){    $this->DB = new MySQL_Database($this->db_host, $this->db_user, $this->db_dbase, $this->db_pass);   }      if (!$this->session_lifetime = get_cfg_var('session.gc_maxlifetime')) {    $this->session_lifetime = 1440;   }  } # end class constructor

        /**  * Function that is not needed but required by session_set_save_handler  * @author Bobby Easland  * @version 1.0  * @param string $path  * @param string $name  * @return boolean  */     function _open($path, $name) {         return true;     } # end function

        /**  * Function that to perform basic garbage collection  * @author Bobby Easland  * @version 1.0  * @return boolean  */     function _close() {         $this->_gc();         return true;     } # end function

        /**  * Function to return session value  * @author Bobby Easland  * @version 1.0  * @param string $sesskey session_id  * @return string serialized array of session data  */     function _read($sesskey) {         $sql = "SELECT value           FROM " . $this->session_table . "     WHERE sesskey = '" . $this->DB->Slashes($sesskey) . "'     AND expiry > '" . time() . "'     LIMIT 1";         $query = $this->DB->Query($sql);

        $num_rows = $this->DB->NumRows($query);         if ($num_rows > 0) {             $data = $this->DB->FetchArray($query);             $session_data = $data["value"];             return $session_data;         } else {             return '';         }     } # end function

        /**  * Function to write session value  * @author Bobby Easland  * @version 1.0  * @param string $key  * @param string $value  * @return boolean  */     function _write($key, $value) {

        $expiry = time() + $this->session_lifetime;

        $sql = "SELECT COUNT(*) as total     FROM " . $this->session_table . "     WHERE sesskey = '" . $this->DB->Slashes($key) . "'";   $check_query = $this->DB->Query($sql);   $check = $this->DB->FetchArray($check_query);

        if ($check['total'] > 0) {    $update_sql = "UPDATE " . $this->session_table . "          SET expiry = '" . $this->DB->Slashes($expiry) . "', value = '" . $this->DB->Slashes($value) . "'          WHERE sesskey = '" . $this->DB->Slashes($key) . "'";    return $this->DB->Query($update_sql);   } else {    $insert_sql = "INSERT INTO " . $this->session_table . " values ('" . $this->DB->Slashes($key) . "', '" . $this->DB->Slashes($expiry) . "', '" . $this->DB->Slashes($value) . "')";    return $this->DB->Query($insert_sql);   }     } # end function

        /**  * Function to destroy session value  * @author Bobby Easland  * @version 1.0  * @param string $sesskey  * @return boolean  */     function _destroy($sesskey) {         $delete_sql = "DELETE FROM " . $this->session_table . " WHERE sesskey = '$sesskey'";         return $this->DB->Query($delete_sql);     } # end function

        /**  * Function to perform basic garbage collection  * @author Bobby Easland  * @version 1.0  * @return boolean  */     function _gc() {      return $this->DB->Query("DELETE FROM " . $this->session_table . " where expiry < '" . time() . "'");     } # end function

        } # end class

        /**  * MySQL_DataBase Class  *  * The MySQL_DataBase class provides abstraction so the database can be accessed  * without having to use tep API functions. This class has minimal error handling  * so make sure your code is tight!  * @package osC-External-Sessions  * @license http://opensource.org/licenses/gpl-license.php GNU Public License  * @version 1.1  * @link http://www.oscommerce-freelancers.com/ osCommerce-Freelancers  * @copyright Copyright 2005, Bobby Easland  * @author Bobby Easland  / class MySQL_DataBase{  /*   * Database host (localhost, IP based, etc)  * @var string   /  var $host;  /*   * Database user  * @var string   /  var $user;  /*   * Database name  * @var string   /  var $db;  /*   * Database password  * @var string   /  var $pass;  /*   * Database link  * @var resource   */  var $link_id;

        /**  * MySQL_DataBase class constructor  * @author Bobby Easland  * @version 1.0  * @param string $host  * @param string $user  * @param string $db  * @param string $pass  */  function MySQL_DataBase($host, $user, $db, $pass){   $this->host = $host;   $this->user = $user;   $this->db = $db;   $this->pass = $pass;   $this->ConnectDB();   $this->SelectDB();  } # end function

        /**  * Function to connect to MySQL  * @author Bobby Easland  * @version 1.1  */  function ConnectDB(){   $this->link_id = mysql_connect($this->host, $this->user, $this->pass);  } # end function

        /**  * Function to select the database  * @author Bobby Easland  * @version 1.0  * @return resoource  */  function SelectDB(){   return mysql_select_db($this->db);  } # end function

        /**  * Function to perform queries  * @author Bobby Easland  * @version 1.0  * @param string $query SQL statement  * @return resource  */  function Query($query){   return @mysql_query($query, $this->link_id);  } # end function

        /**  * Function to fetch array  * @author Bobby Easland  * @version 1.0  * @param resource $resource_id  * @param string $type MYSQL_BOTH or MYSQL_ASSOC  * @return array  */  function FetchArray($resource_id, $type = MYSQL_BOTH){   return @mysql_fetch_array($resource_id, $type);  } # end function

        /**  * Function to fetch the number of rows  * @author Bobby Easland  * @version 1.0  * @param resource $resource_id  * @return mixed  */  function NumRows($resource_id){   return @mysql_num_rows($resource_id);  } # end function

        /**  * Function to fetch the last insertID  * @author Bobby Easland  * @version 1.0  * @return integer  */  function InsertID() {   return mysql_insert_id();  }

        /**  * Function to free the resource  * @author Bobby Easland  * @version 1.0  * @param resource $resource_id  * @return boolean  */  function Free($resource_id){   return @mysql_free_result($resource_id);  } # end function

        /**  * Function to add slashes  * @author Bobby Easland  * @version 1.0  * @param string $data  * @return string  */  function Slashes($data){   return addslashes($data);  } # end function

        } # end class ?>

      3. funktioniert super mit cookies, aber nicht so richtig, wenn cookis disabled sind.

        versuch ich gerade herauszufinden, woran das liegen könnte?

        hab den Fehler gefunden.

        Auch bei einem iframe funktioniert genauso wie bei JS output_add_rewrite_var
        nicht

        als ich hier auch expliziert die Konstante SID /Session_name und session_id mitgegeben habe.
        funktioniert doch alles.

        grüße von mir

        cartsen