Session in Datenbank speichern

Hey ho, ich habe gerade folgendes Problem:
In einem Shopsystem wird die Session in der Datenbank gespeichert. Wenn ein Kunde seine Daten angibt, werden diese vie Post gesendet, in der Session gespeichert und die wiederum landet in der Datenbank und wird von dort auch wieder ausgelesen.
An sich funktioniert das alles bis zu dem Zeitpunkt wo jemand auf den Gedanken kommt, Anführungszeichen, oder Slashes zu verwenden. Verbieten dieser Zeichen ist keine Option, weil es ja auch Namen mit ’ gibt.

Ich komme irgendwie nicht auf eine Lösung, daher beschreibe ich mal, was alles gemacht wird und wie das Problem genau aussieht. Vielleicht hat ja jemand von euch einen Tipp für mich.

Jedes Post in dem System wird als erstes mit einem mysqli_real_escape_string durch eine Schleife gejagt.
Dann kann ich selber noch irgendwelche Änderungen an den Daten machen und sie an die Session übergeben.

Das funktioniert augenscheinlich auch, bis zu dem Zeitpunkt, wo die Seite neu geladen wird. Dann ist die Session kaputt.
Wir (ein paar Kollegen und ich) hatten schon den session.serialize_handler im verdacht, und haben anstelle des Standard php handlers wddx ausprobiert, das hat das Ergebnis zwar verändert, aber irgendwo muss noch ein Fehler sein und der session.serialize_handler kann nicht die eigentliche Ursache sein.
Die Session geht auch da kaputt… Haben auch schon probiert die Zeichen zu maskieren, auch das führt zu keiner Besserung. Sobald sie enthalten sind, geht die Session kaputt. Dadurch kann sie nicht richtig ausgelesen werden und die Folge ist letztendlich „nur“, dass einige Teile der Session verloren gehen (das was man als vorher eingegeben hat) und solange die Daten nicht vernünftig vorhanden sind, kann nicht bestellt werden, aber irgendwie muss sich das doch beheben lassen.
Als wir uns die Sessiondaten in der DB angeschaut haben, ist uns aufgefallen, dass wenn es zu dem Fehler kommt viel mehr schließende Klammern } als öffnende { gibt. Wenn man dann die gleichen Daten nochmal Abschlickt, bläst das die (kaputte) Session nach und nach bis zu einem gewissen Punkt auf.

Da ich keinen Quellcode Posten kann, frage ich hier einfach nur nach Tipps, und Spekulationen, die zu dem Problem führen könnten. Vielleicht hilft es ja.

Aber hier mal ein Beispiel auf welche Art die Session kaputt geht:
In dem Beispiel ist im Nachnamen ein ’ enthalten.

Servus,

genau hier ist das Problem:

Der Länge des Strings 'asdgfarsg' ist 11 Zeichen, sollte aber laut der Annotation davor 13 Zeichen umfassen. Vermutlich machst du etwas in diese Richtung:

$user = [
    "first_name" => "Heike",
    "last_name" => "Hoch'kommata"
];


// Alle Strings sicher machen!
foreach($user AS $key => $value) {
    $user[$key] = mysqli_real_escape_string($link, $value);
}

$session_data = serialize($user);

mysqli_query($link, "UPDATE session SET data='$session_data' WHERE id='$session_id'");

Korrekt wäre allerdings

$user = [
    "first_name" => "Heike",
    "last_name" => "Hoch'kommata"
];

$session_data = mysqli_real_escape_string($link, serialize($user));

mysqli_query("UPDATE session SET data='$session_data' WHERE id='$session_id'");

Das Problem ist, dass bei ersterem Beispiel die Backslashes mit in die Anzahl der Zeichen einfließen, beim einfügen in die Datenbank aber entfernt werden.

Mal abgesehen davon wäre es vermutlich einfacher Prepared Statements zu verwenden, anstatt jeden Parameter mit mysqli_real_escape_string zu escapen.

Grüße
Michael

Danke dir Michael,
Mal schauen, ob sich deine Tipps als Lösung so umsetzen lässt, oder ob wir nun probieren werden alle “bösen” Zeichen weg zu filtern, bzw. in andere umzuwandeln, da es ein bestehendes System ist und sich die Änderung auf ganz viel anderes auswirken würde.
Grüße zurück!