Dynamische Webseiten-Technologie PHP-Analyse von Cookies und Sitzungen
Autor:Eve Cole
Aktualisierungszeit:2009-06-06 18:16:01
1. PHP-COOKIE
Ein Cookie ist ein Mechanismus, der Daten in einem Remote-Browser speichert, um Benutzer zu verfolgen und zu identifizieren.
PHP sendet Cookies in den Header-Informationen des http-Protokolls, daher muss die Funktion setcookie() aufgerufen werden, bevor andere Informationen an den Browser ausgegeben werden, was der Einschränkung für die Funktion header() ähnelt.
1.1 Cookies setzen:
Cookies können mit den Funktionen setcookie() oder setrawcookie() gesetzt werden. Es kann auch festgelegt werden, indem http-Header direkt an den Client gesendet werden.
1.1.1 Verwenden Sie die Funktion setcookie(), um Cookies zu setzen:
bool setcookie ( String-Name [, String-Wert [, Int Expire [, String-Pfad [, String-Domäne [, Bool Secure [, Bool httponly]]]]]] )
Name: Cookie-Variablenname
Wert: der Wert der Cookie-Variablen
ablaufen: der Zeitpunkt, an dem die Gültigkeitsdauer endet,
Pfad: gültiges Verzeichnis,
Domäne: gültiger Domänenname, eindeutige Top-Level-Domäne
sicher: Wenn der Wert 1 ist, ist das Cookie nur auf https-Verbindungen gültig, wenn der Standardwert 0 ist, sind sowohl http als auch https gültig.
Beispiel:
<?php
$value = 'etwas von irgendwo';
setcookie("TestCookie", $value); /* Einfache Cookie-Einstellungen*/
setcookie("TestCookie", $value, time()+3600); /* Gültigkeitsdauer beträgt 1 Stunde*/
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* Gültiges Verzeichnis/~rasmus, gültiger Domainname example.com und alle seine Subdomains */
?>
Legen Sie mehrere Cookie-Variablen fest: setcookie('var[a]','value'); Verwenden Sie ein Array, um die Variable darzustellen, aber ihr Index benötigt keine Anführungszeichen. Auf diese Weise können Sie $_COOKIE['var'][ verwenden. 'a'], um die COOKIE-Variable zu lesen.
1.1.2. Verwenden Sie header(), um Cookies zu setzen.
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
Die folgenden Parameter sind dieselben wie die oben für die Funktion „setcookie“ aufgeführten.
Zum Beispiel:
$value = 'etwas von irgendwo';
header("Set-Cookie:name=$value");
1.2 Auslesen von Cookies:
Sie können die in PHP integrierte superglobale Variable $_COOKIE direkt verwenden, um die Cookies auf der Browserseite zu lesen.
Im obigen Beispiel ist das Cookie „TestCookie“ gesetzt. Jetzt lesen wir es:
print $_COOKIE['TestCookie'];
Wurde der COOKIE exportiert?!
1.3 Cookies löschen
Stellen Sie einfach die gültige Zeit so ein, dass sie kleiner als die aktuelle Zeit ist, und setzen Sie den Wert auf leer. Beispiel:
setcookie("name","",time()-1);
Ähnlich wie bei der Verwendung von header().
1.4 Häufige Probleme lösen:
1) Bei der Verwendung von setcookie() wird eine Fehlermeldung angezeigt. Dies kann daran liegen, dass vor dem Aufruf von setcookie() eine Ausgabe oder Leerzeichen vorhanden sind. Es kann auch sein, dass Ihr Dokument aus anderen Zeichensätzen konvertiert wurde und das Dokument möglicherweise eine Stücklistensignatur hat am Ende (das heißt, indem Sie einige versteckte Stücklistenzeichen zum Dateiinhalt hinzufügen). Sie können dies auch ein wenig verhindern, indem Sie die Funktion ob_start() verwenden.
2) $_COOKIE ist von magic_quotes_gpc betroffen und kann automatisch maskiert werden
3) Bei der Nutzung ist zu testen, ob der Nutzer Cookies unterstützt
<!--[if !supportLineBreakNewLine]-->
1.5 Funktionsweise von Cookies:
Manche Lernende sind impulsiver und haben keine Zeit, die Prinzipien zu studieren, deshalb erwähne ich es später.
a) Der Server setzt ein Cookie im Client, indem er mit der Antwort einen HTTP-Set-Cookie-Header sendet (mehrere Cookies erfordern mehrere Header).
b) Der Client sendet automatisch einen HTTP-Cookie-Header an den Server, und der Server empfängt und liest ihn.
HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=etwas von irgendwoher;
Gültig bis: Do, 19. November 2007, 18:52:00 GMT
Cache-Kontrolle: kein Speichern, kein Cache, erneute Validierung erforderlich, Nachprüfung = 0, Vorprüfung = 0
Pragma: kein Cache
Inhaltstyp: Text/HTML
Diese Zeile implementiert die Cookie-Funktion nach Erhalt dieser Zeile
Set-Cookie: TestCookie=etwas von irgendwoher;
Der Browser erstellt eine Cookie-Datei auf der Festplatte des Clients und schreibt:
TestCookie=etwas von irgendwo;
/
Diese Zeile ist das Ergebnis der Verwendung von setcookie('TestCookie','something fromwhere','/'); Sie ist auch das Ergebnis der Verwendung von header('Set-Cookie: TestCookie=something fromwhere; path=/'). ;.
<!--[endif]-->
2. PHP-Sitzung
Die Sitzung verwendet ein Cookie mit einer Ablaufzeit von 0 und eine eindeutige Kennung namens Sitzungs-ID (eine lange Zeichenfolge), um einige Sitzungsdateien auf der Serverseite zu synchronisieren (Sie können den Sitzungsspeichertyp selbst definieren) und mit ihnen zu kommunizieren Der Benutzer ist verbunden. Die Webanwendung speichert die mit diesen Sitzungen verbundenen Daten und ermöglicht die Weitergabe der Daten zwischen Seiten mit dem Benutzer.
Besuchern der Website wird eine eindeutige Kennung, eine sogenannte Session-ID, zugewiesen. Es wird entweder in einem clientseitigen Cookie gespeichert oder über die URL übergeben.
Durch die Sitzungsunterstützung können Benutzer beliebig viele Variablen registrieren und für jede Anfrage reservieren. Wenn ein Besucher auf die Website zugreift, prüft PHP, ob eine bestimmte Sitzungs-ID in der Anfrage gesendet wurde, entweder automatisch (wenn session.auto_start auf 1 gesetzt ist) oder wenn der Benutzer sie anfordert (explizit von session_start() aufgerufen oder implizit von session_register( )). Wenn ja, wird die zuvor gespeicherte Umgebung neu erstellt.
2.1 Übermittlung der SessionID
2.1.1 Sitzungs-ID über Cookie übertragen
Verwenden Sie session_start(), um die Sitzung aufzurufen. Beim Generieren der Sitzungsdatei generiert der Server den Sitzungs-ID-Hashwert und den Sitzungsnamen mit dem Standardwert PHPSESSID und sendet die Variable an den Client (der Standardwert ist) PHPSESSID (Sitzungsname). ), mit dem Wert Ist ein 128-Bit-Hashwert. Der Server interagiert über dieses Cookie mit dem Client.
Der Wert der Sitzungsvariablen wird intern von PHP serialisiert und in einer Textdatei auf dem Servercomputer gespeichert und interagiert mit dem Coolie des Clients, dessen Variablenname standardmäßig PHPSESSID ist.
Das heißt, der Server sendet automatisch den http-Header: header('Set-Cookie: session_name()=session_id(); path=/');
Das heißt, setcookie(session_name(),session_id());
Wenn Sie von dieser Seite zu einer neuen Seite springen und session_start() aufrufen, überprüft PHP die serverseitig gespeicherten Sitzungsdaten, die mit der angegebenen ID verknüpft sind. Wenn sie nicht gefunden werden, wird ein neuer Datensatz erstellt.
2.1.2 Sitzungs-ID über URL übertragen
Diese Methode wird nur verwendet, wenn der Benutzer die Verwendung von Cookies verbietet, da Browser-Cookies bereits universell sind und diese Methode aus Sicherheitsgründen nicht erforderlich ist.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>, der Sitzungswert kann auch per POST übergeben werden.
2.2 Grundlegende Anwendungsbeispiele für Sitzungen
<?php
// Seite1.php
session_start();
echo 'Willkommen auf Seite #1';
/* Sitzungsvariablen erstellen und Sitzungsvariablen Werte zuweisen */
$_SESSION['favcolor'] = 'grün';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();
// Wenn der Client Cookies verwendet, kann die Sitzung direkt an page2.php übergeben werden
echo '<br /><a href="page2.php">Seite 2</a>';
// Wenn der Client Cookies deaktiviert
echo '<br /><a href="page2.php?' . SID . '">Seite 2</a>';
/*
Standardmäßig hat die SID unter PHP5.2.1 nur dann einen Wert, wenn das Cookie während der Sitzung geschrieben wird
Das entsprechende Cookie existiert bereits, dann ist die SID (undefiniert) leer
*/
?>
<?php
// page2.php
session_start();
print $_SESSION['animal']; // Eine einzelne Sitzung ausdrucken
var_dump($_SESSION); // Den von page1.php übergebenen Sitzungswert ausgeben
?>
2.3 Verwenden Sie die Sitzungsfunktion, um das Seiten-Caching zu steuern.
In vielen Fällen müssen wir feststellen, ob unsere Webseite auf dem Client zwischengespeichert ist, oder die Cache-Gültigkeitszeit festlegen. Wenn sich beispielsweise vertrauliche Inhalte auf unserer Webseite befinden, müssen Sie sich anmelden, um diese lokal zwischenzuspeichern , können Sie den lokalen Cache direkt öffnen. Sie können im Internet surfen, ohne sich anzumelden.
Verwenden Sie session_cache_limiter('private'); um den Seiten-Client-Cache zu steuern, der vor session_start() aufgerufen werden muss.
Weitere Parameter finden Sie unter Client-Cache-Steuerung unter http://blog.chinaunix.net/u/27731/showart.php?id=258087 .
Um die Client-Cache-Zeit zu steuern, verwenden Sie session_cache_expire(int); Unit(s). Es muss auch vor session_start() aufgerufen werden.
Dies ist nur eine Methode zur Steuerung des Cachings bei Verwendung von session. Wir können auch das Caching der Seite in header() steuern.
2.4 Sitzung löschen
Um dies zu erreichen, sind drei Schritte erforderlich.
<?php
session_destroy(); // Der erste Schritt: Löschen Sie die serverseitige Sitzungsdatei, die diese verwendet
setcookie(session_name(),'',time()-3600); // Schritt 2: Aktuelle Sitzung löschen:
$_SESSION = array(); // Schritt 3: Löschen Sie das globale Variablenarray $_SESSION
?>
2.5 Die Verwendung von Sitzungen in großen PHP-Webanwendungen ist die derzeit beste Methode für den Zugriff auf die Sitzung Funktion bool session_set_save_handler (Callback open, Callback close, Callback read, Callback write, Callback destroy, Callback gc) sind die Lösungen, die uns zur Lösung dieses Problems zur Verfügung gestellt wurden.
Die 6 von dieser Funktion verwendeten Funktionen sind wie folgt:
1. bool open() wird zum Öffnen des Sitzungsspeichermechanismus verwendet.
2. bool close() schließt den Sitzungsspeichervorgang.
3. mixde read() Verwenden Sie diese Funktion, wenn Sie Sitzungsdaten aus dem Speicher laden
4. bool write() schreibt alle Daten der angegebenen Sitzungs-ID in den Speicher
5. bool destroy() zerstört die mit der angegebenen Sitzungs-ID verknüpften Daten
6. bool gc() Ein Beispiel für die Speicherbereinigung von Daten im Speichersystem finden Sie in der Funktion session_set_save_handler() im PHP-Handbuch.
Wenn Sie Klassen verwenden, um damit umzugehen, verwenden Sie
session_set_save_handler(
array('className','open'),
array('className','close'),
array('className','read'),
array('className','write'),
array('className','destroy'),
array('className','gc'),
)
Der Aufruf der 6 statischen Methoden in der Klasse „className“ kann in ein Objekt geändert werden, sodass keine Notwendigkeit besteht, statische Methoden aufzurufen. Für die Verwendung statischer Mitglieder ist jedoch keine Generierung eines Objekts erforderlich, und die Leistung ist besser.
2.6 Häufig verwendete Sitzungsfunktionen:
bool session_start(void); Sitzung initialisieren
bool session_destroy(void): Mit der serverseitigen Sitzung verknüpfte Dateien löschen.
string session_id() ID der aktuellen Sitzung
string session_name() Der aktuell aufgerufene Sitzungsname, der der Cookie-Name ist, unter dem der Client die Sitzungs-ID speichert. Der Standardwert ist PHPSESSID.
array session_get_cookie_params() Sitzungsdetails, die dieser Sitzung zugeordnet sind.
string session_cache_limiter() steuert den Client-Cache von Seiten, die die Sitzung verwenden
ini session_cache_expire() steuert die Client-Cache-Zeit
bool session_destroy() löscht die Datei, die Sitzungsinformationen auf der Serverseite speichert
void session_set_cookie_params ( int life [, string path [, string domain [, bool secure [, bool httponly]]]] ) Legt die mit dieser Sitzung verknüpften Sitzungsdetails fest
bool session_set_save_handler (callback open, callback close, callback read, callback write, callback destroy, callback gc) definiert die Funktion für die Verarbeitung der Sitzung (ohne Verwendung der Standardmethode)
bool session_regenerate_id([bool delete_old_session]) weist eine neue Sitzungs-ID zu
2.7 Probleme mit der Sitzungssicherheit Angreifer unternehmen große Anstrengungen, um an die effektive Sitzungs-ID eines vorhandenen Benutzers zu gelangen. Mithilfe der Sitzungs-ID können sie möglicherweise über dieselben Fähigkeiten wie dieser Benutzer im System verfügen.
Daher besteht unsere Hauptlösung darin, die Gültigkeit der Sitzungs-ID zu überprüfen.
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* Wenn die Benutzersitzungs-ID gefälscht ist*/
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();