Im Vergleich zu Cookies ist Session eine serverseitige Sitzung, relativ sicher, und im Gegensatz zu Cookies gibt es keine Speicherlängenbegrenzung. Dieser Artikel gibt eine kurze Einführung in die Verwendung von Session.
Da Session serverseitig als Textdateien gespeichert wird, besteht keine Gefahr, dass Clients den Inhalt von Session ändern. Tatsächlich ändert PHP für die Session-Dateien auf der Serverseite automatisch die Dateiberechtigungen, sodass nur System-Lese- und Schreibberechtigungen übrig bleiben, und sie können nicht über FTP geändert werden, daher ist es viel sicherer.
Für Cookies: Angenommen, wir möchten überprüfen, ob ein Benutzer angemeldet ist. Wir müssen den Benutzernamen und das Passwort (möglicherweise eine md5-verschlüsselte Zeichenkette) im Cookie speichern und sie bei jeder Seitenanfrage überprüfen. Wenn Benutzername und Passwort in der Datenbank gespeichert sind, muss jedes Mal eine Datenbankabfrage ausgeführt werden, was eine unnötige Belastung für die Datenbank verursacht. Denn wir können nicht nur einmal überprüfen. Warum? Weil die Informationen im Client-Cookie geändert werden können. Angenommen, Sie speichern eine $admin-Variable, um anzuzeigen, ob der Benutzer angemeldet ist. Wenn $admin true ist, bedeutet das angemeldet; wenn false, bedeutet das nicht angemeldet. Nachdem die erste Überprüfung erfolgreich war, speichern Sie $admin gleich true im Cookie, und beim nächsten Mal ist keine Überprüfung nötig. Ist das richtig? Falsch. Wenn jemand eine $admin-Variable mit dem Wert true fälscht, würde er dann nicht sofort Administratorrechte erlangen? Das ist sehr unsicher.
Session ist anders. Session wird serverseitig gespeichert, daher können entfernte Benutzer den Inhalt von Session-Dateien nicht ändern. Deshalb können wir einfach eine $admin-Variable speichern, um festzustellen, ob der Benutzer angemeldet ist. Nachdem die erste Überprüfung erfolgreich war, setzen Sie $admin auf true. Prüfen Sie später, ob dieser Wert true ist; wenn nicht, leiten Sie zur Anmeldeseite weiter. Dies kann viele Datenbankoperationen reduzieren. Es verringert auch die Unsicherheit, bei der Cookie-Überprüfung jedes Mal Passwörter zu übertragen (bei der Session-Überprüfung muss nur einmal übertragen werden, wenn Sie nicht das SSL-Sicherheitsprotokoll verwenden). Selbst wenn das Passwort md5-verschlüsselt ist, kann es leicht abgefangen werden.
Natürlich hat die Verwendung von Session viele weitere Vorteile, z. B. einfache Steuerung und die Möglichkeit, die Speicherung je nach Benutzer anzupassen (z. B. Speicherung in einer Datenbank). Darauf gehe ich hier nicht näher ein.
Muss Session in php.ini konfiguriert werden? Im Allgemeinen nicht, weil nicht jeder die Berechtigung hat, php.ini zu ändern. Der Standard-Speicherpfad für Session ist der temporäre Systemordner des Servers. Wir können ihn anpassen, sodass er in unserem eigenen Ordner gespeichert wird, was ich später vorstellen werde.
Jetzt wollen wir vorstellen, wie man eine Session erstellt. Es ist wirklich sehr einfach.
Starten Sie eine Session und erstellen Sie eine $admin-Variable:
Beispiel
// Session starten
session_start();
// Deklariere eine Variable namens admin und weise einen leeren Wert zu.
$_SESSION["admin"] = null;
?>
Wenn Sie Session verwenden oder wenn diese PHP-Datei Session-Variablen aufrufen muss, müssen Sie sie vor dem Aufrufen von Session starten, und zwar mit der Funktion session_start(). Sie müssen nichts anderes konfigurieren; PHP erstellt die Session-Datei automatisch.
Nach Ausführung dieses Programms können wir zum temporären Systemordner gehen, um diese Session-Datei zu finden. Im Allgemeinen sieht der Dateiname so aus: sess_4c83638b3b0dbf65583181c2f89168ec, gefolgt von einer 32-Bit-kodierten Zufallszeichenfolge. Öffnen Sie sie mit einem Editor und sehen Sie sich ihren Inhalt an:
admin|N;
Im Allgemeinen hat der Inhalt die folgende Struktur:
variable name|type:length:value;
Jede Variable wird durch ein Semikolon getrennt. Einige Teile können weggelassen werden, wie Länge und Typ.
Sehen wir uns das Verifizierungsprogramm an, wobei angenommen wird, dass die Datenbank den Benutzernamen und das md5-verschlüsselte Passwort speichert:
Code der Datei login.php
// Nachdem das Formular abgesendet wurde...
$posts = $_POST;
// Einige Whitespace-Zeichen entfernen
foreach ($posts as $key => $value) {
$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"];
$query = "SELECT `username` FROM `user` WHERE `password` = '$password' AND `username` = '$username'";
// Das Abfrageergebnis abrufen
$userInfo = $DB->getRow($query);
if (!empty($userInfo)) {
// Session nach erfolgreicher Verifizierung starten
session_start();
// Die admin-Variable für erfolgreiche Anmeldung registrieren und true zuweisen
$_SESSION["admin"] = true;
} else {
die("Ungültiger Benutzername oder Passwort");
}
?>
Auf Seiten, die eine Benutzerauthentifizierung erfordern, starten wir die Session und stellen fest, ob der Benutzer angemeldet ist:
Beispiel
// Durch globale Variablen verursachte Sicherheitsrisiken verhindern
$admin = false;
// Starten Sie die Session, dieser Schritt ist unerlässlich
session_start();
// Feststellen, ob der Benutzer angemeldet ist
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true) {
echo "Sie haben sich erfolgreich angemeldet";
} else {
// Überprüfung fehlgeschlagen, setzen Sie $_SESSION["admin"] auf false
$_SESSION["admin"] = false;
die("Sie haben keine Berechtigung für den Zugriff");
}
?>
Ist es nicht einfach? Betrachten Sie $_SESSION einfach als ein Array, das serverseitig gespeichert ist. Jede Variable, die wir registrieren, ist ein Schlüssel des Arrays, genau wie bei der Verwendung eines Arrays.
Was ist, wenn Sie sich vom System abmelden möchten? Zerstören Sie einfach die Session.
Beispiel
session_start();
// Diese Methode zerstört eine zuvor registrierte Variable
unset($_SESSION['admin']);
// Diese Methode zerstört die gesamte Session-Datei
session_destroy();
?>
Kann Session eine Lebensdauer wie Cookie festlegen? Sollten wir mit Session Cookie vollständig aufgeben? Ich würde sagen, dass die Verwendung von Session in Kombination mit Cookie am bequemsten ist.
Wie identifiziert Session den Client-Benutzer? Er wird durch die Session-ID identifiziert. Was ist eine Session-ID? Sie ist der Dateiname dieser Session-Datei. Die Session-ID wird zufällig generiert, wodurch Eindeutigkeit und Zufälligkeit gewährleistet und die Sicherheit der Session sichergestellt wird. Im Allgemeinen wird die Session-ID, wenn die Session-Lebensdauer nicht festgelegt ist, im Speicher abgelegt. Nach dem Schließen des Browsers wird die ID automatisch abgemeldet, und nach erneutem Aufrufen der Seite wird eine neue Session-ID registriert.
Wenn der Client Cookie nicht deaktiviert, übernimmt Cookie die Rolle, die Session-ID und die Session-Lebensdauer beim Start der Session-Sitzung zu speichern.
Legen wir die Session-Lebensdauer manuell fest:
Beispiel
session_start();
// Für einen Tag speichern
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");
?>
Tatsächlich bietet Session auch eine Funktion session_set_cookie_params(); zum Festlegen der Lebensdauer der Session. Diese Funktion muss aufgerufen werden, bevor die Funktion session_start() aufgerufen wird:
Beispiel
// Für einen Tag speichern
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>
Wenn der Client IE 6.0 verwendet, kann die Funktion session_set_cookie_params(); Probleme beim Setzen von Cookies haben, daher rufen wir weiterhin manuell die Funktion setcookie auf, um das Cookie zu erstellen.
Was ist, wenn der Client Cookies deaktiviert? Daran führt kein Weg vorbei; alle Lebensdauern sind an den Browserprozess gebunden. Sobald der Browser geschlossen wird, müssen Sie die Session erneut registrieren, wenn Sie die Seite erneut anfordern. Wie übergeben Sie dann die Session-ID? Übergeben Sie sie über die URL oder über ein verstecktes Formular. PHP sendet die Session-ID automatisch an die URL. Die URL sieht so aus: http://www.test.cn/index.php?PHPSESSID= bba5b2a240a77e5b44cfa01d49cf9669, wobei der Parameter PHPSESSID in der URL die Session-ID ist. Wir können $_GET verwenden, um diesen Wert zu erhalten und dadurch die Session-ID zwischen Seiten weiterzugeben.
Beispiel
// Für einen Tag speichern
$lifeTime = 24 * 3600;
// Aktuellen Sessionnamen abrufen, Standard ist PHPSESSID
$sessionName = session_name();
// Session-ID abrufen
$sessionID = $_GET[$sessionName];
// Verwenden Sie session_id(), um die erhaltene Session-ID festzulegen
session_id($sessionID);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION['admin'] = true;
?>
Bei virtuellen Hosts, wenn alle Sessions der Benutzer im temporären Systemordner gespeichert werden, führt dies zu Wartungsschwierigkeiten und verringert die Sicherheit. Wir können den Speicherpfad für Session-Dateien manuell festlegen. session_save_path() bietet eine solche Funktion. Wir können das Session-Speicherverzeichnis auf einen Ordner verweisen, auf den nicht über das Web zugegriffen werden kann. Natürlich muss der Ordner Lese- und Schreibberechtigungen haben.
Beispiel
// Ein Speicherverzeichnis festlegen
$savePath = './session_save_dir/';
// Für einen Tag speichern
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION['admin'] = true;
?>
Wie die Funktion session_set_cookie_params(); muss auch die Funktion session_save_path() vor der Funktion session_start() aufgerufen werden.
Wir können auch Arrays und Objekte in der Session speichern. Das Bearbeiten von Arrays unterscheidet sich nicht vom Bearbeiten gewöhnlicher Variablen, aber beim Speichern von Objekten serialisiert PHP die Objekte automatisch (auch Serialisierung genannt) und speichert sie dann in der Session. Das folgende Beispiel veranschaulicht dies:
Code der Datei person.php
class person {
var $age;
function output() {
echo $this->age;
}
function setAge($age) {
$this->age = $age;
}
}
?>
setage.php Datei-Code
session_start();
require_once 'person.php';
$person = new person();
$person->setAge(21);
$_SESSION['person'] = $person;
echo '<a href='output.php'>hier klicken, um das Alter auszugeben</a>';
?>
output.php Datei-Code
// Callback-Funktion festlegen, um sicherzustellen, dass das Objekt neu erstellt wird.
ini_set('unserialize_callback_func', 'mycallback');
function mycallback($classname) {
include_once $classname . '.php';
}
session_start();
$person = $_SESSION['person'];
// Ausgabe 21
$person->output();
?>
Wenn wir die Datei setage.php ausführen, rufen wir die Methode setage() auf, setzen das Alter auf 21 und serialisieren diesen Zustand, bevor wir ihn in der Session speichern (PHP führt diese Konvertierung automatisch durch). Wenn wir zu output.php gehen, um diesen Wert auszugeben, müssen wir das soeben gespeicherte Objekt deserialisieren. Und da die Deserialisierung das Instanziieren einer nicht definierten Klasse erfordert, haben wir eine Callback-Funktion definiert, die die Klassendatei person.php automatisch einbindet, sodass das Objekt rekonstruiert wird und der aktuelle Alterswert als 21 erhalten wird; dann wird die Methode output() aufgerufen, um diesen Wert auszugeben.
Darüber hinaus können wir auch die Funktion session_set_save_handler verwenden, um die Art und Weise anzupassen, wie die Session aufgerufen wird.
Originaladresse: https://www.cnblogs.com/happyforev1/articles/1645916.html