2015-09-28 16 views
6

Ich habe eine Datenbank basierte Session Storage-Lösung. Funktioniert super! Ich habe jedoch ein Problem mit dem Speichern einer bestimmten Art von Daten.PHP serialisierte Daten in mysql db gespeichert Fehler

Ich habe eine Anwendung, die CSRF-Tokens verwendet. Wenn ein Formular erstellt wird, erstellt es ein Token für dieses Formular. Das Token ist ein Hashwert (sha256) verschiedener Arten von Werten. Eine Kopie wird in das Formular übertragen und eine weitere Kopie wird in den Sitzungen gespeichert. Nach dem Absenden des Formulars vergleicht es die Tokens, um sicherzustellen, dass sie übereinstimmen.

Unten ist ein Beispiel für die Zerstörungsfunktion, welche die DB mit den neuen Daten aktualisiert

UPDATE session_manager SET variables= :variables WHERE 1=1 AND id = :id 
array(2) { 
    [":variables"]=> 
     string(152) "a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"e749603241dec1911ef3a40d98b2f5185d389434060483297394b504cc904ede";s:4:"time";i:1443456816;}}}" 
    [":id"]=> 
     string(2) "49" 
} 

Update-Anweisung in Ordnung ist und funktioniert gut. Dies ist das Problem, das ich habe, die Daten werden aktualisiert, aber der "Token" -Wert, den Sie in den Daten sehen können, ist nicht derselbe Wert in der Datenbank, die unten ist (Dies ist ein binärer Download der Daten):

a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"b48fc79fc2f51eff765c05476895238a42d9d45b2c1aeb7c6e4582d0381b7f4f";s:4:"time";i:1443456817;}}} 

Es scheint, dass mysql den Wert ändert und ich kann nicht für das Leben von mir herausfinden, das Problem. Lösungen, die ich habe versucht, die folgenden:

  • serialize
  • json_encode
  • base64

Ändern charsets der db und was nicht. Versuchte verschiedene Feldtypen in der db zum Beispiel TEXT, Longtext und BLOB. Welche scheint für mich nicht zu funktionieren :(

Hier ist die SQL für die db

CREATE TABLE session_manager(
    id BIGINT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    session_id VARCHAR(200), 
    user_agent TINYTEXT NOT NULL, 
    variables BLOB NOT NULL, 
    initial_time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, 
    regenerate_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL 
); 

Alle Gründe, die den Sinn Pop?

+1

Ich denke nicht, dass MySQL Ihren Wert verändert.Sie müssen Ihr Update eine andere Zeichenfolge in Ihrem PHP-Code füttern ... Sie verwenden vorbereitete Anweisungen für Ihr Update ... Versuchen Sie ein 'echo $ tokenValue;' direkt vor der Update-Anweisung, um den Wert zu überprüfen –

+0

Das Array, das Sie gerade sehen Nach der update-Anweisung ist ein Dump der gebundenen Parameter vor der Ausführung der Datenbankabfrage. – Tim

+0

Verwenden Sie 'Text' als Typ, es löst das Problem möglicherweise nicht, aber es ist ein Problemlösungsvorschlag. Ich habe es gesehen. –

Antwort

1

Haben Sie bei time Index Ihrer Array geschaut? Es scheint auch, dass es sich geändert hat. Dies lässt mich denken, dass die Methode zum Speichern der Sitzung mindestens zweimal ausgeführt wird. Das zweite Mal wird die Sitzung aktualisiert und überschreibt den alten Wert.

Führen Sie diesen Code mit einem Debugger angeschlossen , oder drucken/protokollieren Sie eine Stack-Trace-Vorabversion ry Zeit Ihre Funktion aufgerufen wird. Dies sollte Ihnen eine ziemlich gute Idee geben, wenn der Wert erneut aktualisiert wird.

PS: Wird die Aktualisierungsabfrage bei der nächsten Anfrage erneut aufgerufen, bevor Sie den Wert abrufen können?

+0

Ja, ich habe es bemerkt, nachdem ich versucht habe nach Lösungen zu suchen. Ich habe mein Problem gelöst. Nein, das Update befindet sich in einer Zerstörungsfunktion. Prost – Tim

1

Ok. Also nach weiterem Nachforschen und dem Input von allen (Cheers übrigens). Ich habe mein Problem gelöst.

Es stellte sich heraus, dass es überhaupt nichts mit mysql zu tun hatte. Es hatte tatsächlich mit dem "favicon.ico" zu tun. Ich verwende schicke URLs wie du und weil ich im Entwickler bin, habe ich mich nie mit dem Favicon beschäftigt. Beim Laden der Seite versucht es standardmäßig ein Favicon zu finden (http://localhost/favicon.ico). Das System geht davon aus, dass ein Benutzer versucht, auf einen Controller zuzugreifen (ich verwende mvc), und weil der Controller nicht existiert, leitet er auf die Homepage um. Die Startseite erfordert ein Token, das generiert wird, da ein Formular vorhanden ist, und als Ergebnis generiert es ein Token ein zweites Mal, das ursprüngliche Token ungültig zu machen. Es war etwas, das ich nach dem Betrachten aller Netzwerkverbindungen durch die Entwicklerkonsole erkannte.