In PHP können wir beim Anpassen des Sitzungsverarbeitungsmechanismus die Sitzungsspeicherlogik anpassen, indem wir die SitzungsHandlerInterface implementieren oder die Sitzungshandlerklasse erben. SessionHandler :: create_sid () ist unter ihnen eine umschreibensbare Methode, mit der eine Sitzungs -ID generiert wird. Das Verständnis des Renditewerts dieser Methode und ihres Zwecks ist besonders wichtig für die Debugie komplexer Sitzungsmechanismen.
create_sid () wird automatisch aufgerufen, wenn Session_Start () aufgerufen wird und derzeit keine gültige Sitzungs -ID vorhanden ist. Sein Zweck ist es, eine neue, eindeutige Sitzungs -ID -Zeichenfolge zurückzugeben. Die Standardimplementierung basiert auf der Sitzung .
class MySessionHandler extends SessionHandler {
public function create_sid(): string {
return hash('sha256', random_bytes(32));
}
}
session_set_save_handler(new MySessionHandler(), true);
session_start();
Im obigen Code haben wir 32-Byte-Zufallsdaten mit SHA-256, um eine eindeutige Sitzungs-ID zu generieren, und der zurückgegebene Wert ist ähnlich:
82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
Die von Create_sid () zurückgegebene Zeichenfolge muss die folgenden Punkte erfüllen:
Einzigartigkeit : Es darf nicht innerhalb eines bestimmten Zeitbereichs wiederholt werden.
Unvorhersehbar : Sie können die Sitzung von Sitzungen nicht leicht erraten und verhindern.
Kompatibel mit Session .
Wenn Sie die oben genannten Bedingungen nicht erfüllen, kann dies zu Sitzungskonflikten oder Sicherheitslücken führen.
Der direkteste Weg zum Debuggen create_sid () besteht darin, vorübergehend Protokollierungs- und Verfolgungsinformationen hinzuzufügen:
public function create_sid(): string {
$sid = hash('sha256', random_bytes(32));
error_log("Erstellen Sie eine neue Sitzung ID: $sid");
return $sid;
}
Dadurch wird jedes generierte SID in das PHP -Fehlerprotokoll geschrieben. Der Pfad ist normalerweise /var/log/php_errors.log oder konfiguriert über php.ini .
Verwenden Sie Entwickler-Tools (z. B. das Netzwerk-Tag von Chrome) in Ihrem Browser, um den Header für Set-Cookie -Antwort in der Anforderung anzuzeigen, und bestätigen Sie, ob die vom Server zurückgegebene Sitzungs-ID der Inhalt ist, den Sie erwarten.
Zum Beispiel könnte die Rückkehr zum Header wie folgt aussehen:
Set-Cookie: PHPSESSID=82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73; path=/; HttpOnly
Überprüfen Sie, ob die Sitzungsdaten mit dieser ID tatsächlich im Speicher -Backend (z. B. Redis, Dateisystem, Datenbank) gespeichert sind. Wenn Sie beispielsweise die Sitzung in Redis speichern:
$sessionKey = "PHPREDIS_SESSION:sess_$sid";
Sie können den Befehl verwenden:
GET PHPREDIS_SESSION:sess_82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
Um zu überprüfen, ob der Sitzungsschlüssel existiert.
Eine Debug -Seite kann vorübergehend erstellt werden, um die aktuelle Sitzungs -ID und den aktuellen Status anzuzeigen:
session_start();
echo "<pre>aktuell Session ID: " . session_id() . "</pre>";
echo "<pre>Session Inhalt: ";
print_r($_SESSION);
echo "</pre>";
Die Ausgabe nach dem Zugriff auf die Seite ist ähnlich:
aktuell Session ID: 82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
Session Inhalt: Array
(
)
Wenn der Kunde Cookies nicht unterstützt, können Sie die Sitzungs -ID an die URL an das Debuggen anschließen:
https://gitbox.net/debug.php?PHPSESSID=82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
Hinweis : Diese Methode eignet sich nur für das Debuggen der Entwicklungsumgebung. Die Produktionsumgebung deaktiviert URLs, um Sitzungs -IDs zu führen, um eine Sitzung zu vermeiden.
Aktivieren Sie die Sitzung .
Konfigurieren Sie Session.save_path in ein Verzeichnis, das leicht zu lesen und zu schreiben ist, um die Anzeige der ursprünglichen Sitzungsdatei zu erleichtern.
Vorübergehend öffnen Sie die Fehlerberichterstattung und Protokollierung von höherer Ebene in php.ini oder .htaccess .
error_reporting = E_ALL
display_errors = On
log_errors = On
error_log = /tmp/php_error.log