PHP
Sitzungen
Suche…
Syntax
- void session_abort (void)
- int session_cache_expire ([Zeichenfolge $ new_cache_expire])
- void session_commit (void)
- Zeichenfolge session_create_id ([Zeichenfolge $ Präfix])
- bool session_decode (Zeichenfolge $ data)
- bool session_destroy (void)
- Zeichenfolge session_encode (void)
- int session_gc (void)
- array session_get_cookie_params (void)
- string session_id ([string $ id])
- bool session_is_registered (Zeichenfolge $ name)
- Zeichenfolge session_module_name ([string $ module])
- String Sitzungsname ([String $ Name])
- bool session_regenerate_id ([bool $ delete_old_session = false])
- void session_register_shutdown (void)
- bool session_register (gemischter $ name [, mixed $ ...])
- void session_reset (void)
- Zeichenfolge session_save_path ([string $ path])
- void session_set_cookie_params (int $ lifetime [, string $ path [, string $ domain [, bool $ secure = false [, bool $ httponly = false]]]])
- bool session_set_save_handler (aufrufbarer $ open, aufrufbarer $ close, aufrufbarer $ read, aufrufbarer $ write, aufrufbarer $ destroy, aufrufbarer $ gc [, aufrufbarer $ create_sid [, aufrufbarer $ validate_sid [, aufrufbarer $ update_timestamp]]])
- bool session_start ([array $ options = []])
- int session_status (void)
- bool session_unregister (Zeichenfolge $ name)
- void session_unset (void)
- void session_write_close (void)
Bemerkungen
Beachten Sie, dass der Aufruf von session_start()
auch dann eine PHP-Warnung session_start()
, wenn die Sitzung bereits gestartet ist.
Sitzungsdaten bearbeiten
Die Variable $_SESSION
ist ein Array, das Sie wie ein normales Array abrufen oder $_SESSION
können.
<?php
// Starting the session
session_start();
// Storing the value in session
$_SESSION['id'] = 342;
// conditional usage of session values that may have been set in a previous session
if(!isset($_SESSION["login"])) {
echo "Please login first";
exit;
}
// now you can use the login safely
$user = $_SESSION["login"];
// Getting a value from the session data, or with default value,
// using the Null Coalescing operator in PHP 7
$name = $_SESSION['name'] ?? 'Anonymous';
Weitere Informationen zum Arbeiten mit einem Array finden Sie unter Manipulieren eines Arrays.
Wenn Sie ein Objekt in einer Sitzung speichern, kann es nur ordnungsgemäß abgerufen werden, wenn Sie über einen Autoloader für Klassen verfügen oder die Klasse bereits geladen haben. Andernfalls wird das Objekt als Typ __PHP_Incomplete_Class
, was später zu Abstürzen führen kann . Weitere Informationen zum automatischen Laden finden Sie unter Namespacing und Autoloading.
Warnung:
Sitzungsdaten können gekapert werden. Dies ist beschrieben in: Pro PHP-Sicherheit: Von den Prinzipien der Anwendungssicherheit zur Implementierung von XSS Defense - Kapitel 7: Verhindern von Session-Hijacking Es kann daher dringend empfohlen werden, keine persönlichen Informationen in $_SESSION
. Dies würde am kritischsten die Kreditkartennummern , die von der Regierung ausgestellten IDs und die Passwörter beinhalten . Es würde sich aber auch auf weniger Daten ausdehnen, wie Namen , E-Mails , Telefonnummern usw., die es einem Hacker ermöglichen würden, sich als legitimen Benutzer auszugeben. Verwenden Sie in den Sitzungsdaten generell wertlose / nicht persönliche Werte, wie z. B. numerische Bezeichner.
Zerstöre eine ganze Sitzung
Wenn Sie eine Sitzung haben, die Sie zerstören möchten, können Sie dies mit session_destroy()
tun.
/*
Let us assume that our session looks like this:
Array([firstname] => Jon, [id] => 123)
We first need to start our session:
*/
session_start();
/*
We can now remove all the values from the `SESSION` superglobal:
If you omitted this step all of the global variables stored in the
superglobal would still exist even though the session had been destroyed.
*/
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
//Finally we can destroy the session:
session_destroy();
Die Verwendung von session_destroy()
unterscheidet sich von etwas wie $_SESSION = array();
SESSION
werden alle im SESSION
Superglobal gespeicherten Werte SESSION
, die tatsächliche gespeicherte Version der Sitzung wird jedoch nicht zerstört.
Hinweis : Wir verwenden $_SESSION = array();
anstelle von session_unset()
weil das Handbuch session_unset()
festlegt:
Verwenden Sie session_unset () nur für älteren veralteten Code, der $ _SESSION nicht verwendet.
session_start () -Optionen
Beginnend mit PHP-Sitzungen können wir ein Array mit php.ini
Optionen für session_start
an die Funktion session_start
.
Beispiel
<?php
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
// php >= 7 version
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
} else {
// php < 7 version
session_start();
}
?>
Diese Funktion führt auch eine neue php.ini
Einstellung mit dem Namen session.lazy_write
ein. Die php.ini
true
und bedeutet, dass Sitzungsdaten nur dann neu geschrieben werden, wenn sie geändert werden.
Referenzierung: https://wiki.php.net/rfc/session-lock-ini
Sitzungsname
Prüfen, ob Sitzungscookies erstellt wurden
Sitzungsname ist der Name des Cookies, das zum Speichern von Sitzungen verwendet wird. Sie können dies verwenden, um festzustellen, ob für den Benutzer Cookies für eine Sitzung erstellt wurden:
if(isset($_COOKIE[session_name()])) {
session_start();
}
Beachten Sie, dass diese Methode im Allgemeinen nicht nützlich ist, wenn Sie nicht wirklich unnötig Cookies erstellen möchten.
Sitzungsname ändern
Sie können den Sitzungsnamen aktualisieren, indem Sie session_name()
aufrufen.
//Set the session name
session_name('newname');
//Start the session
session_start();
Wenn in session_name()
kein Argument angegeben ist, wird der aktuelle Sitzungsname zurückgegeben.
Es sollte nur alphanumerische Zeichen enthalten. es sollte kurz und beschreibend sein (z. B. für Benutzer mit aktivierten Cookie-Warnungen). Der Sitzungsname darf nicht nur aus Ziffern bestehen, mindestens ein Buchstabe muss vorhanden sein. Andernfalls wird jedes Mal eine neue Sitzungs-ID generiert.
Sitzungssperre
Wie wir alle wissen, schreibt PHP Sitzungsdaten in eine Datei auf der Serverseite. Wenn eine Anfrage an PHP - Skript aus , die die Sitzung über beginnt session_start()
, PHP Sperren diese Sitzungsdatei andere eingehende Anfragen zu blockieren / warten resultierende für gleiche session_id
abzuschließen, weil von denen die anderen Anforderungen an stecken session_start()
bis oder es sei denn, die gesperrte Sitzungsdatei wird nicht freigegeben
Die Sitzungsdatei bleibt gesperrt, bis das Skript abgeschlossen ist oder die Sitzung manuell geschlossen wird. Um diese Situation zu vermeiden, dh um zu verhindern, dass mehrere Anforderungen blockiert werden , können wir die Sitzung starten und die Sitzung schließen, wodurch die Sperrung der Sitzungsdatei aufgehoben wird und die verbleibenden Anforderungen fortgesetzt werden können.
// php < 7.0
// start session
session_start();
// write data to session
$_SESSION['id'] = 123; // session file is locked, so other requests are blocked
// close the session, release lock
session_write_close();
Jetzt wird überlegt, ob die Sitzung geschlossen ist, wie die Sitzungswerte gelesen werden sollen, auch wenn die Sitzung geschlossen ist und die Sitzung noch verfügbar ist. So können wir die Sitzungsdaten immer noch lesen.
echo $_SESSION['id']; // will output 123
In php> = 7.0 können wir nur read_only session, read_write session und lazy_write session haben. Daher ist es nicht erforderlich, session_write_close()
Sichere Sitzung ohne Fehler starten
Viele Entwickler haben dieses Problem, wenn sie an großen Projekten arbeiten, insbesondere wenn sie an einigen modularen CMS mit Plugins, Addons, Komponenten usw. arbeiten wenn die Sitzung gestartet ist Wenn keine Sitzung vorhanden ist, starte ich die Sitzung sicher. Wenn eine Sitzung existiert, passiert nichts.
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
if(session_status() == PHP_SESSION_NONE) {
session_start(array(
'cache_limiter' => 'private',
'read_and_close' => true,
));
}
}
else if (version_compare(PHP_VERSION, '5.4.0') >= 0)
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
}
else
{
if(session_id() == '') {
session_start();
}
}
Dies kann Ihnen sehr session_start
Fehler session_start
zu vermeiden.