Headers, cookies et sessions Chargement de fichiers (upload) Entêtes HTTP et redirections Gestion des cookies et des sessions de connexions Authentification Validation des données Programmation avancée 1
Téléchargement (upload) de fichiers Sur certains site, on autorise le client à télécharger un fichier : mettre une photo de son avatar sur un forum Pour un système de gestion de contenu : base de données catalogue mise à jour à distance le rédacteur d'une fiche produit peut charger une photo du produit après avoir saisi sa description Sur les sites proposant des échanges de fichiers : sons, textes, images, etc. Programmation avancée 2
Choix du fichier (du coté client) Le choix se fait dans un formulaire classique : les informations sur le fichiers sont envoyées à : <FORM ACTION="reception.php" les données sont en plusieurs parties : ENCTYPE="multipart/form data"> un bouton permet de choisir le fichier localement <INPUT TYPE="FILE" NAME="toto"> il faut indiquer une limite à la taille du fichier <INPUT TYPE="HIDDEN" NAME="MAX_FILES_SIZE" VALUE="102400"> // pour 100Ko Programmation avancée 3
Réception du fichier (sur le serveur) Lors de la soumission du formulaire (envoi) : le client envoie des informations sur le fichier le serveur le télécharge dans un dossier temporaire Le fichier reçoit un nom temporaire sur le serveur Programmation avancée 4
Réception du fichier (en PHP) Les informations sur le fichier sont placées dans : $_FILES["toto"] Cette variable est un tableau contenant le détail : $_FILES["toto"]["tmp_name"] Nom du fichier temporaire sur le serveur $_FILES["toto"]["name"] Nom du fichier initial sur le client (tel que le voyait l utilisateur) $_FILES["toto"]["type"] Type MIME du fichier ('image/gif', 'image/jpeg', etc.) $_FILES["toto"]["size"] Taille du fichier téléchargé (en octets) Programmation avancée 5
Contrôler le fichier (sur le serveur) On reçoit des informations sur le fichier, on peut les contrôler avant d'utiliser le fichier reçu : => un fichier a t il bien été choisi? if (empty($_files["toto"]["name"])) { } => le fichier est il du type attendu? if ($_FILES["toto"]["type"]=="image/gif") => le fichier a t il une bonne taille? if ($_FILES["toto"]["size"]<102400) Programmation avancée 6
Ranger le fichier (sur le serveur) A la fin du script le fichier temporaire est supprimé automatiquement du serveur => Après vérification, il faut le copier autre part => En général dans un dossier réservé du site => Le serveur doit avoir le droit d'écrire dans ce répertoire La copie du fichier se fait avec : copy(source,destination); copy($_files[ ]["tmp_name"],"dossier/"); Programmation avancée 7
Utilisation futur du fichier En général on stocke dans une base de données le nom du fichier tel qu il a été enregistré sur le serveur Exemple : table d utilisateur avec «avatar» USERS {pseudo, pass, avatar} ( toto, z21, toto.gif ) On utilise l URL du fichier dans le script d affichage : print("<img SRC=\"images/$avatar\">"); Programmation avancée 8
Entêtes HTTP (header) et redirections Le protocole HTTP envoie des informations au client avant le contenu de la page Web : Entêtes ou Headers : le type de fichiers qui va être reçu HTML, jpeg, etc. les cookies, les demandes d'authentification (cf. après) La fonction header() permet d'envoyer des infos en plus : Il faut la placer avant toute chose (avant tous espaces, balises HTML, etc. ) Utilisation principale : demandes de redirection : header("location: http://.../page.html"); Programmation avancée 9
Cookies et sessions : pourquoi? La navigation sur Internet est sans "souvenirs" Pas de conservation de données entre pages, entre différentes visites On a besoin de ce type de mécanisme pour : Authentification automatique sur un forum souvent visité depuis le même PC Panier électronique sur un site marchand Pages/sites Web "personnalisés" par l'utilisateur Comment : des données doivent conserver l "historique" Programmation avancée 10
Les cookies : qu'est ce? Les cookies sont de simples fichiers textes stockés localement par le navigateur Le nom de ces fichiers à la forme : nom@domaine.txt Son contenu : Une date de validité Des données sous la forme "variable=valeur" Programmation avancée 11
Les cookies : fonctionnement Les cookies sont définis par le serveur Web Quand ils sont reçus par le client, ils sont stockés localement A chaque retour sur le serveur (si la date de validité est correcte), le client envois les paires "variable=valeur" au serveur en même temps que la demande de page Ces variables peuvent être utilisées en PHP Les cookies sont supprimés localement par le navigateur, dès que la date de validité expire Programmation avancée 12
Les cookies en action Une seule fonction pour gérer les cookies en PHP : setcookie(nom,valeur,date d'expiration, chemin, domaine, sécurité); Pour créer/envoyer un cookie au client Il faut l'envoyer avant toute chose (Headers) Chemin : peu utilisé Domaine : autre nom du serveur (pas utilisé) Sécurité : utiliser une connexion sécurisé (SSL) Programmation avancée 13
Les cookies et PHP Exemple de création : <? setcookie("nom","toto", time()+(60*60*2)); // valide 2 heures?> Les cookies déjà définis et envoyés par le client définissent des variables PHP : print($_cookie["nom"]); affiche "toto" Programmation avancée 14
Les cookies et PHP Pour supprimer un cookie, il suffit de le créer sans valeur : setcookie("nom"); Attention les valeurs des cookies ne sont actualisés qu'au rechargement de la page En général, on combine avec une redirection On peut recharger en demandant le clic sur un lien Programmation avancée 15
Exemple auto inscription sur un forum L'historique : variable $login = dernier login utilisé Page d'accueil vérifiant l'existence de la variable (envoyée par le cookie) Si variable définie => accès direct au forum Sinon redirection vers un formulaire d'authentification Vérification des login et mot de passe saisis Création d'un cookie avec le login saisi Accès au forum Programmation avancée 16
Exemple 1/3 : la page d'accueil <? if (isset($_cookie["login"])) { // le cookie est défini => déjà venu print("salut $_COOKIE["login"]"); } else { // le cookie n'est pas défini // il faut se logguer header("location: form_login.html"); }?> reste de la page (pas vu si redirection) Programmation avancée 17
Exemple 2/3 : form_login.html <HTML> <FORM ACTION="verif_login.php" METHOD="POST"> <INPUT TYPE="TEXT" NAME"login"> <INPUT TYPE="SUBMIT" VALUE="Envoi"> </FORM> Programmation avancée 18
Exemple 3/3 : verif_login.php <? // la saisie est elle correcte? if (isset($post["login"]) &&!empty($post["login"])) { // on peut vérifier dans une basdo if (test du login sur basdo) { // envoi cookie valide 2 heures setcookie("login", $POST["login"], time()+(60*60*2)); }} header("location: form_login.php");?> Programmation avancée 19
Les sessions : qu'est ce? Les sessions fonctionnent sur le même principe On peut créer des variables associés à une session La session se termine à la fermeture du navigateur Les informations sur les sessions et les variables associés sont stockées sur le serveur (pas chez le client) C'est plus sûr Chaque client reçois un numéro de session unique (automatiquement stocké dans un cookie chez le client) On peut utiliser ce numéro en association avec une base de données (panier électronique, etc.) Programmation avancée 20
Les sessions : gestion en PHP Démarrer une session : session_start(); mêmes limites que header et setcookie : à exécuter avant toute chose Associer des variables : session_register("nomvar1","nomvar2", ); Les valeurs de ces variables sont conservées dans toutes les pages ouvrant une session. $_SESSION["variable"] = "valeur"; Programmation avancée 21
Authentification Le serveur peut envoyer une demande d'authentification au client (dans les headers) Le client demande un login + mot de passe à l'utilisateur, puis envois ces valeurs avec chaque demande de page du même domaine On utilise encore la fonction header() : Header("WWW Authenticate: Basic real=\"mon domaine\""); Header("HTTP/1.0 401 Unauthorized"); Programmation avancée 22
Authentification Les login et mot de passe saisis se retrouve dans des variables PHP : $PHP_AUTH_USER $PHP_AUTH_PW Il suffit de vérifier leur existence : fonction isset() Puis il faut vérifier les valeurs reçues : Un utilisateur et un mot de passe unique Dans une base de données d'utilisateurs Programmation avancée 23
Authentification : exemple <? $ok=false; if (isset($php_auth_user)) { if ($PHP_AUTH_USER=="toto" && $PHP_AUTH_PW=="truc") $ok=true; } if (!$ok) { Header("WWW Authenticate "); Header("HTTP/1.0 "); print("vous devez vous logger"); exit; }?> reste de la page HTML Programmation avancée 24
Validation des données Pourquoi? Contrôler les types et format des données : insertion dans une base de données assurer la validité des calculs suivants éviter les failles de sécurité éviter le détournement des scripts PHP ex : type date, entiers d'une BD ex : insertion de balises dans une chaîne Le contrôle en JavaScript peut être détourné Il est facile de copier un formulaire localement Programmation avancée 25
Validation des données Comment? Bien concevoir le formulaire : proposer des valeurs fixes (listes, dates) imposer les choix possibles (radio, case à cocher) Vérifier en PHP : test de valeurs et d'intervalles : if ($x<10) if ($variable="machin") conversion : intval($x) fonctions vérifiant le type : if (is_numeric($x)) Programmation avancée 26
Validation des données Vérifier le format avec une expression régulière : $format_date = "[0 9]{4} [0 9]{1,2} [0 9]{1,2}" ereg($format_date,$date); $format_mail = "^[[:alpha:]]+@[[:alpha:]]+\.[[:alpha:]]+$" ereg($format_mail,$mail); Programmation avancée 27
Expressions régulières "abc" : la chaîne contient "abc" "ab.d" : contient "ab", puis un caractère, puis "c" "[a f]" : une lettre entre a et f "[0 9]" : un chiffre entre 0 et 9 "[^abc]" : ne contient ni "a", ni "b", ni "c" "exp*" : plusieurs fois l'expression "exp+" : au moins une fois l'expression "exp{4}" : 4 fois l'expression "^exp" : commence par l'expression "exp$" : finit par l'expression Programmation avancée 28
La sécurité des données Le client peut saisir n'importe quoi : des balises HTML! des commandes SQL!! Il faut vérifier et filtrer les données de type chaînes strip_tags($chaine) : enlever les balises htmlentities($chaine) : remplace par des entités les ", ',\, sont automatiquement échappés \", \', \\ pour afficher sans : stripslashes($chaine) remplacer les <entrer> par des <BR> : nl2br( ) (pour conserver la mise en page ; comme <PRE>) Programmation avancée 29