Bobby: unserialize->Problem

Moin

Ich habe eine DAtenbank aus der ich ein feld auslese mit der Bezeichnung session. Dieses Feld enthält ein serialized-Array. Es ist normal in einer PHP-Variable gespeichert: $benutzer->session.

Mit Echo kann ich mir den Inhalt wie folgt ausgeben lassen:

  
a:3:{s:5:"suche";a:7:{s:13:"hiddenanreise";s:0:"";s:13:"hiddenabreise";s:0:"";s:4:"land";s:2:"11";s:3:"ort";s:1:"4";s:7:"anreise";s:12:"30. Jan 2009";s:7:"abreise";s:12:"31. Jan 2009";s:8:"searchid";s:2:"60";}s:3:"reg";a:14:{s:4:"mail";s:23:"xxxxx@xx-xxxxxxxxxxx.de";s:4:"pass";s:7:"xxxxxxx";s:6:"anrede";s:4:"Herr";s:7:"vorname";s:5:"xxxx ";s:8:"nachname";s:5:"xxxxx";s:3:"plz";s:5:"01129";s:3:"ort";s:7:"xxxxxxx";s:4:"land";s:11:"Deutschland";s:7:"strasse";s:23:"Am xxxxxxxxx xxxxxxx 6b";s:3:"tel";s:7:"4245489";s:3:"fax";s:0:"";s:7:"vorwahl";s:4:"0351";s:8:"homepage";s:17:"xx-xxxxxxxxxxx.de";s:3:"key";s:30:"76bRv79FI8wcZBHra98WStCgF187wn";}s:7:"buchung";a:16:{s:8:"searchid";s:2:"60";s:7:"hotelid";s:2:"38";s:9:"hotelname";s:40:"Testhotel -- "NUR TEST-- NICHT BUCHEN"";s:12:"hoteladresse";s:38:"Am xxxxxxxxx xxxxxxx 6b, 00000 xxxxxxx";s:8:"hoteltel";s:16:"03xx/ x xx xx xx";s:8:"hotelfax";s:16:"03xx/ x xx xx xx";s:5:"email";s:22:"info@xx-xxxxxxxxxxx.de";s:16:"hotelkreditkarte";s:3:"YES";s:10:"zimmername";s:4:"test";s:8:"zimmerid";s:2:"60";s:11:"verpflegung";s:2:"FS";s:11:"kreditkarte";s:3:"YES";s:3:"agb";s:37:"AGB des Hotels - Achtung nur ein Test";s:4:"bild";s:6:"a:0:{}";s:10:"2009-01-30";a:5:{s:6:"status";s:1:"1";s:10:"kontingent";s:1:"1";s:6:"storno";s:126:"Kostenlose Stornierung ist bis 24 Stunden vor Anreise möglich, danach und bei Nichterscheinen wird die erste Nacht verrechnet.";s:5:"preis";s:1:"1";s:9:"buchungen";N;}s:11:"gesamtpreis";d:1;}}  

ich möchte nun dieses serialized-String wieder in ein Array schreiben.

Ich haben versucht:

$neuesarray=unserialize($benutzer->session)

Leider bleibt mein $neuesarray leer.

Warum? Was übersehe ich?

Gruß Bobby

--
-> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
-> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  1. Hi,

    $neuesarray=unserialize($benutzer->session)
    Leider bleibt mein $neuesarray leer.

    Du solltest aber Warnungen bekommen, sofern du dein PHP nicht geknebelt hast.

    s:40:"Testhotel -- "NUR TEST-- NICHT BUCHEN"";

    Z.B. die Notation dieses Strings ist fehlerhaft, weil die Anfuehrungszeichen innerhalb des Strings nicht ordnungsgemaesz maskiert sind.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Moin!

      $neuesarray=unserialize($benutzer->session)
      Leider bleibt mein $neuesarray leer.

      Du solltest aber Warnungen bekommen, sofern du dein PHP nicht geknebelt hast.

      s:40:"Testhotel -- "NUR TEST-- NICHT BUCHEN"";

      Z.B. die Notation dieses Strings ist fehlerhaft, weil die Anfuehrungszeichen innerhalb des Strings nicht ordnungsgemaesz maskiert sind.

      Deutet auf fehlendes Escaping beim Schreibvorgang in die DB hin - irgendwo sind die escapenden Backslashes verloren gegangen.

      Und wenn das Escaping bei solchen internen Vorgängen schon fehlt, wird es bei allen anderen Einfügungen von User-Daten in Querys wohl ebenfalls fehlen! Die Applikation ist also hochgradig durch SQL-Injections angreifbar.

      Überdies vermute ich aufgrund des Transfers der Sessionspeicherung weg vom PHP-Standard hin zur SQL-Speicherung, dass auch keinerlei Locking der Sessiondaten vorgenommen wurde. Es kann also außerdem noch zu unschönen Race-Conditions kommen.

      Bobby, warum willst du den PHP-Standardmechanismus nicht beibehalten? Wenn du alles selbst machen willst, handelst du dir mehr Probleme ein, als du wissen kannst!

      - Sven Rautenberg

      1. Moin

        Ok, gib mir mal bitte nen Schubs in die richtige Richtung. Folgendes Problem möchte ich gern lösen. ich habe eine Suche, die mithilfe von Session Daten von einer Seite zur nächsten transportiert. Nun wollte ich das ein user sich anmelden kann, und im Nach bestätigung der eMail-Adresse und Login die Daten aus der letzten Session (wo er sich angemeldet hat) zur Verfügung stehen.

        Ich hoffe das wra verständlich. Gibts dafür ne einfachere Lösung? Ich lerne gern dazu.

        PS: normalerweise maskiere ich alle Werte beim Schreiben in die DB mit mysql_real_escape_string und setze die werte in einafche Hochkammas.

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
        -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
        ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
        1. Moin!

          Ok, gib mir mal bitte nen Schubs in die richtige Richtung. Folgendes Problem möchte ich gern lösen. ich habe eine Suche, die mithilfe von Session Daten von einer Seite zur nächsten transportiert. Nun wollte ich das ein user sich anmelden kann, und im Nach bestätigung der eMail-Adresse und Login die Daten aus der letzten Session (wo er sich angemeldet hat) zur Verfügung stehen.

          Ich hoffe das wra verständlich. Gibts dafür ne einfachere Lösung? Ich lerne gern dazu.

          Warum müssen die Sessiondaten in die Datenbank? Was sollen die dort? Welchen Vorteil ergibt das für die Problemlösung?

          PS: normalerweise maskiere ich alle Werte beim Schreiben in die DB mit mysql_real_escape_string und setze die werte in einafche Hochkammas.

          Und diesmal nicht?

          - Sven Rautenberg

          1. Moin

            Und diesmal nicht?

            OK, Danke. Das war der Hinweis.

            Ich speicher die Session-Daten, da wenn die eMail-Adresse erst später verifiziert wird, der Kunde direkt an den Punkt geleitet werden soll wo er vor der Anmeldeprozedur war. Er soll nicht erst wieder seine Auswahl treffen müssen.

            Danke nochmals für die Hilfe.

            Gruß Bobby

            --
            -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
            -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
            ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    2. Moin

      weil die Anfuehrungszeichen innerhalb des Strings nicht ordnungsgemaesz maskiert sind.

      und die richtige Maskierung wäre? mit addslashes gehts leider auch nicht.

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. Hi,

        weil die Anfuehrungszeichen innerhalb des Strings nicht ordnungsgemaesz maskiert sind.

        und die richtige Maskierung wäre?

        Die, die PHP beim serialisieren automatisch vornimmt.

        mit addslashes gehts leider auch nicht.

        Du solltest zusehen, dass du die Daten unveraendert abgespeichert und wieder ausgelesen bekommst - und nicht naschliessend versuchen, daran herum zu doktoren.

        Sven hat ja schon eine Vermutung geaeussert, an welcher Stelle die Speicherung bei dir falsch laufen koennte.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Moin

          Die, die PHP beim serialisieren automatisch vornimmt.

          Ok, ich serialisiere normal mit $serialize($_SESSION);

          Speicher diesen String 1:1 in die DB und hole diesen wieder heraus und will unserializen. Und dabei erscheint der Fehler.

          Gib mir mal bitte nen Tip was ich wo machen muss, bzw was ich wo falsch mache.

          Gruß Bobby

          --
          -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
          -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
          ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
          1. Moin!

            Die, die PHP beim serialisieren automatisch vornimmt.

            Ok, ich serialisiere normal mit $serialize($_SESSION);

            Speicher diesen String 1:1 in die DB

            Falsch. Hier musst du escapen. mysqli_real_escape_string() (oder meinetwegen auch das ältere mysql_real_escape_string(), sofern du nicht auf das bessere MySQLi-Interface umgestellt hast).

            - Sven Rautenberg

            1. Moin!

              Falsch. Hier musst du escapen. mysqli_real_escape_string() (oder meinetwegen auch das ältere mysql_real_escape_string(), sofern du nicht auf das bessere MySQLi-Interface umgestellt hast).

              Das Handbuch hat meine Links kaputtgemacht! :)

              Der Link oben führt irgendwie doch zum alten mysql_real_escape_string, Hier ist die bessere Version mit mysqli: http://de.php.net/manual/en/mysqli.real-escape-string.php

              - Sven Rautenberg