Technologie de page Web dynamique Analyse PHP sur les cookies et les sessions
Auteur:Eve Cole
Date de mise à jour:2009-06-06 18:16:01
1. COOKIES PHP
Un cookie est un mécanisme qui stocke des données sur un navigateur distant pour suivre et identifier les utilisateurs.
PHP envoie des cookies dans les informations d'en-tête du protocole http, donc la fonction setcookie() doit être appelée avant que d'autres informations ne soient envoyées au navigateur, ce qui est similaire à la restriction sur la fonction header().
1.1 Définir des cookies :
Les cookies peuvent être définis à l'aide des fonctions setcookie() ou setrawcookie(). Il peut également être défini en envoyant des en-têtes http directement au client.
1.1.1 Utilisez la fonction setcookie() pour définir les cookies :
bool setcookie ( nom de chaîne [, valeur de chaîne [, int expire [, chemin de chaîne [, domaine de chaîne [, bool secure [, bool httponly]]]]]] )
name : nom de la variable du cookie
value : la valeur de la variable du cookie
expirer : l'heure à laquelle la période de validité prend fin,
chemin : répertoire valide,
domain : nom de domaine valide, domaine de premier niveau unique
sécurisé : si la valeur est 1, le cookie n'est valide que sur les connexions https, si la valeur par défaut est 0, http et https sont valides.
exemple:
<?php
$value = « quelque chose de quelque part » ;
setcookie("TestCookie", $value); /* Paramètres simples des cookies*/
setcookie("TestCookie", $value, time()+3600); /* La période de validité est de 1 heure*/
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* Répertoire valide/~rasmus, nom de domaine valide example.com et tous ses sous-domaines */
?>
Définissez plusieurs variables de cookie : setcookie('var[a]','value'); Utilisez un tableau pour représenter la variable, mais son indice n'a pas besoin de guillemets. De cette façon, vous pouvez utiliser $_COOKIE['var'][. 'a'] pour lire la variable COOKIE.
1.1.2. Utilisez header() pour définir les cookies ;
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
Les paramètres suivants sont les mêmes que ceux répertoriés ci-dessus pour la fonction setcookie.
Par exemple:
$value = « quelque chose de quelque part » ;
header("Set-Cookie:name=$value");
1.2 Lecture des Cookies :
Vous pouvez directement utiliser la variable super globale intégrée $_COOKIE de PHP pour lire les cookies côté navigateur.
Dans l'exemple ci-dessus, le cookie "TestCookie" est défini. Lisons-le maintenant :
imprimer $_COOKIE['TestCookie'];
Le COOKIE a-t-il été exporté ?!
1.3 Supprimer les cookies
Définissez simplement l'heure valide pour qu'elle soit inférieure à l'heure actuelle et définissez la valeur sur vide. Par exemple :
setcookie("nom","",heure()-1);
Semblable à l’utilisation de header().
1.4 Résoudre les problèmes courants :
1) Il y a un message d'erreur lors de l'utilisation de setcookie(). Cela peut être dû au fait qu'il y a une sortie ou des espaces avant d'appeler setcookie(). Il se peut également que votre document soit converti à partir d'autres jeux de caractères et qu'il ait une signature de nomenclature. à la fin (c'est-à-dire en l'ajoutant au contenu du fichier Quelques caractères cachés de la nomenclature). La solution est d'éviter que cette situation ne se produise dans votre document. Vous pouvez également la gérer un peu en utilisant la fonction ob_start().
2) $_COOKIE est affecté par magic_quotes_gpc et peut être automatiquement échappé
3) Lors de son utilisation, il est nécessaire de tester si l'utilisateur prend en charge les cookies
<!--[if !supportLineBreakNewLine]-->
1.5 Mécanisme de fonctionnement des cookies :
Certains apprenants sont plus impulsifs et n'ont pas le temps d'étudier les principes, je le mets donc plus tard.
a) Le serveur définit un cookie dans le client en envoyant un en-tête http Set-Cookie avec la réponse (plusieurs cookies nécessitent plusieurs en-têtes).
b) Le client envoie automatiquement un en-tête de cookie http au serveur, et le serveur le reçoit et le lit.
HTTP/1.x 200 OK
X-Powered-By : PHP/5.2.1
Set-Cookie : TestCookie=quelque chose de quelque part ; path=/
Expire : jeu. 19 novembre 2007 18:52:00 GMT
Cache-Control : pas de stockage, pas de cache, revalidation obligatoire, post-check=0, pre-check=0
Pragma : sans cache
Type de contenu : texte/html
Cette ligne implémente la fonction cookie.
Set-Cookie : TestCookie=quelque chose de quelque part ; path=/
Le navigateur créera un fichier cookie sur le disque du client et écrira :
TestCookie=quelque chose venant de quelque part ;
/
Cette ligne est le résultat de l'utilisation de setcookie('TestCookie','something fromwhere','/');. C'est également le résultat de l'utilisation de header('Set-Cookie: TestCookie=something fromwhere; path=/') ;.
<!--[endif]-->
2. Séance PHP
La session utilise un cookie avec le délai d'expiration défini sur 0 et utilise un identifiant unique appelé ID de session (une longue chaîne) pour synchroniser certains fichiers de session côté serveur (vous pouvez définir vous-même le type de stockage de session) et communiquer avec l'utilisateur connecté. L'application Web stocke les données associées à ces sessions et permet de transmettre les données entre les pages avec l'utilisateur.
Les visiteurs du site Web se voient attribuer un identifiant unique, appelé identifiant de session. Il est soit stocké dans un cookie côté client, soit transmis via l'URL.
La prise en charge de session permet aux utilisateurs d'enregistrer n'importe quel nombre de variables et de les réserver pour chaque demande. Lorsqu'un visiteur accède au site Web, PHP vérifie si un identifiant de session spécifique a été envoyé dans la requête, soit automatiquement (si session.auto_start est défini sur 1), soit lorsque l'utilisateur le demande (appelé explicitement par session_start() ou implicitement par session_register( )). Si tel est le cas, l'environnement précédemment enregistré est recréé.
2.1 Transmission de l'ID de session
2.1.1 Transmettre l'ID de session via un cookie
Utilisez session_start() pour appeler la session. Lors de la génération du fichier de session, le serveur génère la valeur de hachage de l'ID de session et le nom de session avec la valeur par défaut de PHPSESSID, et envoie la variable au client (la valeur par défaut est) PHPSESSID (nom de session). ), avec la valeur Est une valeur de hachage de 128 bits. Le serveur interagira avec le client via ce cookie.
La valeur de la variable de session est sérialisée en interne par PHP et stockée dans un fichier texte sur la machine serveur, et interagit avec le coolie du client dont le nom de variable est PHPSESSID par défaut.
Autrement dit, le serveur envoie automatiquement l'en-tête http : header('Set-Cookie: session_name()=session_id(); path=/');
Autrement dit, setcookie(session_name(),session_id());
Lorsque vous passez à une nouvelle page à partir de cette page et que vous appelez session_start(), PHP vérifiera les données de session stockées côté serveur associées à l'ID donné. S'il n'est pas trouvé, un nouvel ensemble de données sera créé.
2.1.2 Transmettre l'ID de session via une URL
Cette méthode n'est utilisée que lorsque l'utilisateur interdit l'utilisation de cookies, car les cookies du navigateur sont déjà universels et, pour des raisons de sécurité, cette méthode n'est pas nécessaire.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>, la valeur de la session peut également être transmise via POST.
2.2 Exemples d'utilisation de base de la session
<?php
// page1.php
session_start();
echo 'Bienvenue sur la page n°1';
/* Créer des variables de session et attribuer des valeurs aux variables de session */
$_SESSION['favcolor'] = 'vert';
$_SESSION['animal'] = 'chat';
$_SESSION['heure'] = heure();
// Si le client utilise des cookies, la session peut être passée directement à page2.php
echo '<br /><a href="page2.php">page 2</a>';
// Si le client désactive les cookies
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
/*
Par défaut, sous php5.2.1, le SID n'aura une valeur que lors de l'écriture du cookie si la session.
Le cookie correspondant existe déjà, alors le SID sera (non défini) vide
*/
?>
<?php
// page2.php
session_start();
print $_SESSION['animal']; // Imprimer une seule session
var_dump($_SESSION); // Affiche la valeur de session transmise par page1.php
?>
2.3 Utilisez la fonction de session pour contrôler la mise en cache des pages.
Dans de nombreux cas, nous devons déterminer si notre page Web est mise en cache sur le client ou définir la durée de validité du cache. Par exemple, notre page Web contient du contenu sensible et vous devez vous connecter pour le visualiser s'il est mis en cache localement. , vous pouvez ouvrir directement le cache local. Vous pouvez naviguer sur le Web sans vous connecter.
Utilisez session_cache_limiter('private'); pour contrôler le cache du client de page, qui doit être appelé avant session_start().
Pour plus de paramètres, consultez le contrôle du cache client sur http://blog.chinaunix.net/u/27731/showart.php?id=258087 .
Pour contrôler le temps de cache du client, utilisez session_cache_expire(int); unit(s). Il doit également être appelé avant session_start().
Il s'agit uniquement d'une méthode pour contrôler la mise en cache lors de l'utilisation de la session. Nous pouvons également contrôler la mise en cache de la page dans header().
2.4 Supprimer une séance
Il faut trois étapes pour y parvenir.
<?php
session_destroy(); // La première étape : Supprimer le fichier de session côté serveur, cela utilise
setcookie(session_name(),'',time()-3600); // Étape 2 : Supprimer la session actuelle :
$_SESSION = array(); // Étape 3 : Supprimer le tableau de variables globales $_SESSION
?>
2.5 Utilisation de la session dans les applications Web PHP à grande échelle. Pour les sites avec un grand nombre de visites, la méthode de stockage de session par défaut n'est pas adaptée. La meilleure méthode actuelle consiste à utiliser la base de données pour accéder à la session. function bool session_set_save_handler (callback open, callback close, callback read, callback write, callback destroy, callback gc) sont les solutions qui nous sont fournies pour résoudre ce problème.
Les 6 fonctions utilisées par cette fonction sont les suivantes :
1. bool open() est utilisé pour ouvrir le mécanisme de stockage de session,
2. bool close() ferme l'opération de stockage de session.
3. mixde read() Utiliser cette fonction lors du chargement des données de session depuis le stockage
4. bool write() écrit toutes les données de l'ID de session donné dans le stockage
5. bool destroy() détruit les données associées à l'ID de session spécifié
6. bool gc() Pour un exemple de garbage collection de données dans le système de stockage, voir la fonction session_set_save_handler() dans le manuel PHP.
Si vous utilisez des classes pour le gérer, utilisez
session_set_save_handler(
array('NomClasse','open'),
array('NomClasse','fermer'),
array('NomClasse','lire'),
array('NomClasse','write'),
array('NomClasse','destroy'),
array('NomClasse','gc'),
)
Appelez les 6 méthodes statiques de la classe className. ClassName peut être modifié en objet, il n'est donc pas nécessaire d'appeler des méthodes statiques. Cependant, l'utilisation de membres statiques ne nécessite pas de générer un objet et les performances sont meilleures.
2.6 Fonctions de session couramment utilisées :
bool session_start (void); initialiser la session
bool session_destroy(void) : supprime les fichiers associés à la session côté serveur.
string session_id() ID de la session en cours
string session_name() Le nom de la session actuellement consultée, qui est le nom du cookie dans lequel le client enregistre l'ID de session. La valeur par défaut est PHPSESSID.
array session_get_cookie_params() Détails de la session associés à cette session.
string session_cache_limiter() contrôle le cache client des pages à l'aide de la session
ini session_cache_expire() contrôle le temps de cache du client
bool session_destroy() supprime le fichier qui enregistre les informations de session côté serveur
void session_set_cookie_params ( int life [, string path [, string domain [, bool secure [, bool httponly]]]] ) Définit les détails de la session associés à cette session
bool session_set_save_handler (callback open, callback close, callback read, callback write, callback destroy, callback gc) définit la fonction de traitement de la session (sans utiliser la méthode par défaut)
bool session_regenerate_id([bool delete_old_session]) attribue un nouvel identifiant de session
2.7 Problèmes de sécurité de session Les attaquants déploient beaucoup d'efforts pour tenter d'obtenir l'ID de session effectif d'un utilisateur existant. Avec l'ID de session, ils peuvent pouvoir disposer des mêmes capacités que cet utilisateur dans le système.
Par conséquent, notre solution principale consiste à vérifier la validité de l’ID de session.
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* Si l'ID de session utilisateur est falsifié*/
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();