La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Développement PHP4 Programmation avancée. PHP niveau 2: le menu PHP niveau 2: le menu Programmation Objet Accès système de fichier Upload de fichiers.

Présentations similaires


Présentation au sujet: "Développement PHP4 Programmation avancée. PHP niveau 2: le menu PHP niveau 2: le menu Programmation Objet Accès système de fichier Upload de fichiers."— Transcription de la présentation:

1 Développement PHP4 Programmation avancée

2 PHP niveau 2: le menu PHP niveau 2: le menu Programmation Objet Accès système de fichier Upload de fichiers Traitement d'images Envoi d'e-mails Sécuriser un serveur PHP

3 Programmation Objet en PHP ● Notion d'Objet ● déclaration ● instanciation / utilisation des objets ● constructeur ● héritage ● méthodes statiques ● sérialisation ● fonctions sur les objets

4 Programmation Objet Notions Il est possible de représenter dans un langage tel que PHP tout ce qui peut être assimilé à un objet : ● Un compte en banque, ● une voiture, ● une connexion ou un curseur de base de donnée ● etc.. On utilise pour cela une structure de donnée spéciale, appelée classe, qui contient à la fois : ● des variables (des propriétés), et ● des fonctions (méthodes) qui agissent sur ces variables. On définit donc par une classe, un type d’objet.

5 Programmation Objet Déclaration En PHP, pour définir une classe, on utilise le mot clé class, suivi, entre crochets, de la liste des propriétés (avec le mot-clé var) et des méthodes de la classe (avec le mot-clé function) Class nomClasse { var $propriete1; var $propriete2; function methode1(...){ // corps de la methode 1 } function methode2(...){ // corps de la methode 2 }

6 Programmation Objet Déclaration class compteBanque { var $solde=100; var $numero; function deposer($montant){ $this->solde += $montant; } function retirer($montant){ $this->solde -= $montant; } Exemple: Pour accéder aux propriétés dans les méthodes, il faut employer la variable réservée $this suivi de l ’opérateur -> puis du nom de la propriété.

7 Programmation Objet Instanciation Après avoir défini une classe, il est possible alors de créer des objets sur ce type (instanciation). On le fait avec le mot clé new. On exécute ensuite les méthodes et accède aux propriétés de l ’objet grâce à l ’opérateur -> <? // instanciation d’un objet $monCompte = new compteBanque; // affectation d’une valeur à une propriété $monCompte->numero="004659872"; // appel d ’une méthode $monCompte->deposer(50); ?>

8 Programmation Objet Constructeur Lors de l ’instanciation d ’un objet, il est utile de pouvoir automatiquement initialiser des propriétés avec des valeurs par défaut et/ou d'exécuter des traitements sur cet objet. On le fait dans une méthode spéciale appelée constructeur. Cette méthode porte le nom de la classe et peut recevoir des paramètres. Class compteBanque { var $solde; var $numero; function compteBanque($soldeInitial){ $this->solde=$soldeInitial; } //... } $monCompte = new compteBanque(100);

9 Programmation Objet Lors de la déclaration avec var, on ne peut initialiser les propriétés qu'avec des constantes. Si on veut les affecter avec des valeurs issues d'autres variables ou de fonctions, il faut le faire dans le constructeur. Si on veut accéder à un objet stocké dans une variable de session, il faut mettre la déclaration de la classe avant la première utilisation de cette variable de session. En comparaison avec d’autres langages objet : ● Il n ’y a pas de limitation d'accès (public, protégé, privé) aux propriétés et aux méthodes. Tout est public. ● Il n ’y a pas de destructeur. A noter :

10 Programmation Objet Héritage On peut avoir besoin de définir un objet qui ressemble à un autre objet avec quelques différences : ● propriétés et méthodes supplémentaires ● méthodes avec des traitements différents (=surcharge)... Plutôt que de réécrire une classe de A à Z, on va déclarer une classe (classe fille) qui hérite des propriétés et méthodes de la classe d’origine (classe mère). Cette déclaration se fait grâce au mot-clé extends. class compteASeuil extends compteBanque { var $soldeLimite; function compteASeuil($soldeInitial, $limite=0){ $this->soldeLimite=$limite; $this->solde=$soldeInitial; } function retirer($montant){ if($this->solde - $montant > $this->soldeLimite ) $this->solde -= $montant; }

11 Programmation Objet : Héritage Pour appeler les méthodes d'une classe mère, on utilise l'opérateur '::' et le mot clé parent parent::nomMethode(); class compteASeuil extends compteBanque { var $soldeLimite; function compteASeuil($soldeInitial, $limite=0){ $this->soldeLimite=$limite; parent::compteBanque($soldeInitial); } function retirer($montant){ if($this->solde - $montant > $soldeLimite ) parent::retirer($montant); }

12 Programmation Objet Méthodes statiques il ne faut pas que la méthode appelée utilise des propriétés non initialisées sous peine de dysfonctionnement (pas d'utilisation de $this-> dans cette méthode). Il est également possible d'appeler des méthodes d'une classe sans avoir à l'instancier, en indiquant le nom de la classe et l'opérateur '::'. maClasse::nomMethode(); class compteBanque { function aide(){ echo "voici de l'aide sur l'objet compteBanque"; } echo "vous voulez de l'aide ?"; compteBanque::aide();

13 Programmation Objet Objectif : Ecrire une classe qui représente un caddie d'une boutique online avec : Une propriété de type tableau contenant la liste des produits (clé=nom et valeur=quantité) Un constructeur Une méthode permettant d'ajouter un produit dans le caddie Une méthode affichant le contenu du caddie Instancier ensuite un objet de ce type, ajouter des produits et afficher le contenu du caddie. (exo_caddie.class.php et exo_caddie1.php)

14 Programmation Objet Sérialisation La sérialisation permet de transformer un objet en une représentation sous forme de chaîne, afin de pouvoir le stocker dans un fichier, une base de donnée, de le transférer sur le réseau etc.. La fonction serialize(), serialise l'objet (objet -> chaîne) tandis que la fonction unserialize() réalise l'inverse (chaîne -> objet). Avant de faire un unserialize(), il est nécessaire d'avoir déclaré au préalable la classe de l'objet. include("compteBanque.class.php"); $compte = new compteBanque(10); $s = serialize($compte); $fp = fopen("cpt.bin", "w"); fputs($fp, $s); fclose($fp); include("compteBanque.class.php"); $fp=fopen("data.bin", "r"); $s = fread($fp,filesize("cpt.bin")); $cpt = unserialize($s); fclose($fp); $cpt->credite(53); echo $cpt->solde; Page1.php Page2.php

15 Programmation Objet Sérialisation et session Lorsque l'on stocke un objet en session, celui-ci est sérialisé automatiquement, et dé-sérialisé lors du session_start(). La déclaration de la classe doit être faite avant le session_start() et doit être incluse sur toutes les pages utilisant les sessions, même si les objets en sessions ne sont pas utilisés. Il semble qu'il y ait quelques problèmes si les sessions sont automatiques (session.auto_start = 1 dans php.ini). Pour utiliser correctement les objets avec les sessions, mettre session.auto_start = 0 include("compteBanque.class.php"); session_start(); $compte = new compteBanque(10); session_register('compte'); include("compteBanque.class.php"); session_start(); $c=$HTTP_SESSION_VARS['cpt']; $c->credite(53); echo $c->solde; Page1.phpPage2.php

16 Programmation Objet Sérialisation : __sleep & __wakeup Les méthodes "magiques" __sleep et __wakeup, sont appelées respectivement juste avant la sérialisation et juste après la dé-sérialisation d'un objet. Elle peuvent servir à réaliser différentes tâches à ces moments là : fermer/retablir une connection de base de donnée ouverte par l'objet, "nettoyer" des propriétés qui n'ont pas besoin d'être sauvées, mettre à jour des propriétés etc... Class compteBanque { var $interet; function __sleep(){ $this->calculInteret(); } function __wakeup(){ }

17 Programmation Objet Objectif : Faire une page qui affiche le contenu d'un objet de type caddie (cf exercice précédent), stocké en session, et un formulaire permettant de saisir le nom d'un produit et sa quantité à ajouter au caddie. Bonus : faire la même chose mais en stockant l'objet dans le formulaire. Exo_caddie.class.php et exo_caddie2.php

18 Accès système de fichier ouverture / fermeture PHP dispose de fonctions similaires à d'autres langages pour lire et écrire dans des fichiers. $fp=fopen("nomFichier", "mode"); fopen : ouvre un fichier dans un mode et renvoie un pointeur sur le contenu du fichier Mode: "r" : lecture seule, pointeur au début "r+" : lecture /écriture, pointeur au début "w" : écriture seule, pointeur au début, taille ramené à 0 "w+" : lecture/écriture, pointeur au début, taille ramené à 0 "a" : écriture seule, pointeur à la fin "a+" : lecture/écriture, pointeur à la fin rajouter "b" (ex: "rb") pour travailler sur fichiers binaires pour les systèmes qui font la différence texte/binaire (Windows) Note : Il est possible d'ouvrir des fichiers distants par http (lecture seule) ou ftp (mode passif): $fp=fopen("ftp://login:passwd@ftp.site.com/rep/monfichier", "r"); fclose($fp); fclose : ferme un fichier après lecture, écriture etc..

19 Accès système de fichier lecture fread : lit dans le fichier ouvert, un certain nombre de caractères (ou octets), qui sont renvoyés dans une chaine. $contenu=fread( $fp, nombreCaractère); fgets : lit une ligne dans un fichier texte, jusqu'au saut de ligne ou le nombre de caractères spécifié sur la ligne courante. $ligne=fgets( $fp [, nombreCaractère ] ); fgetc : lit un seul caractère. Renvoie ce caractère ou false si la fin du fichier est atteint. $caractere=fgetc( $fp ); feof : permet de savoir si le pointeur est à la fin du fichier $booleen=feof( $fp );

20 Accès système de fichier écriture fwrite : écrit le contenu d'une chaîne dans un fichier, avec éventuellement un nombre maximum de caractères. Renvoie le nombre de caractères écrits. $nombre=fwrite( $fp, "contenu",[ nombreCaractere]); $montexte="Hello world"; $fp = fopen("readme.txt", "w"); fputs($fp, $montexte); fclose($fp); fputs : alias de fwrite $fp=fopen("readme.txt", "r"); $taille=filesize("readme.txt"); $contenu=fread($fp,$taille); fclose($fp); echo $contenu; Exemple : écriture lecture

21 Accès système de fichier divers readline() permet d'afficher tout le contenu d'un fichier texte (sans avoir à l'ouvrir et le fermer) file() renvoi toutes les lignes d'un fichier texte dans un tableau. fseek() fait avancer le pointeur vers une position précise dans le fichier. copy(), rename(), unlink() permettent respectivement de copier, renommer ou détruire un fichier. file_exists() indique si un fichier existe. filesize() donne la taille d'un fichier et fileperms() les droits d'accès d'un fichier. if(file_exists('readme.txt')){ copy('readme.txt', 'lisezmoi.txt'); } readline('lisezmoi.txt'); // affiche le contenu echo filesize('lisezmoi.txt'); // affiche la taille $fp=fopen('lisezmoi.txt','r'); fseek($fp,4, SEEK_CUR); // avance de 4 caractères echo fread($fp,5); // lit 5 caractères fclose($fp);

22 Accès système de fichier répertoires Des fonctions permettent de naviguer dans l'arborescence du système de fichier chdir permet de changer de répertoire courant. Pour obtenir la liste des fichiers d'un répertoire, on utilise les fonctions opendir, readdir, closedir. chdir("/tmp"); // pour filetype $dir = opendir("/tmp"); while ($file = readdir($dir)) { echo $file."(".filetype($file).") "; } closedir($dir);

23 Accès système de fichier L'accès à un fichier peut être conditionné par le niveau de sécurité configuré dans PHP. De plus il faut éviter de mettre ce genre de fonctionnalité (un explorateur) sur un site pour des raisons de sécurité... Objectif : Faire un explorateur de répertoire. Un lien sur un sous-répertoire affiche la liste des fichiers qu'il contient. Un lien sur un fichier affiche le contenu de celui-ci. Tout ceci dans la même page. Exo_explorer.php

24 Upload de fichiers Le protocole HTTP permet à l'utilisateur de télécharger des fichiers sur le serveur via un formulaire HTML. Ce formulaire doit contenir : Un attribut supplémentaire dans la balise : enctype="multipart/form-data" autant de balise que de fichier à télécharger. Le formulaire doit être envoyé avec la méthode POST. Eventuellement, une balise, qui précise la taille maximale du fichier accepté, en octets (à placer avant la balise file). <form name="saisie" action="upload.php" method="POST" enctype="multipart/form-data"> votre fichier : Exemple :

25 Upload de fichiers Une fois le formulaire posté, les fichiers indiqués par l'utilisateur sont téléchargés sur le serveur et enregistrés dans un répertoire temporaire (indiqué dans php.ini). La main est ensuite donnée à la page php indiquée dans l'action du formulaire. Une série de variables est pré-renseignée avec des informations sur les fichiers reçus, permettant de les traiter. Il s'agit de $HTTP_POST_FILES ou $_FILES (PHP 4.1.0+). Ces variables sont des tableaux, contenant des éléments dont la clé porte le nom de la balise file, et la valeur, un tableau contenant les informations sur le fichier. $_FILES['monfichier']['name'] : nom original du fichier $_FILES['monfichier']['type'] : mime-type du fichier $_FILES['monfichier']['size'] : taille du fichier (en octet) $_FILES['monfichier']['tmp_name'] : nom du fichier stocké dans le répertoire temporaire

26 Upload de fichiers Grâce à $_FILES, il est possible de vérifier ce qu'on a reçu. L'étape suivante consiste à copier le/les fichiers téléchargés dans un répertoire définitif. En effet, les fichiers reçus sont automatiquement effacés du répertoire temporaire après exécution de la page. Il faut dans ce cas soit utiliser la fonction copy() conjointement avec la fonction is_uploaded_file(), soit la fonction move_uploaded_file() if (is_uploaded_file($_FILES['monFichier']['tmp_name'])) { copy($_FILES['monFichier']['tmp_name'], "/chemin/destination/".$_FILES['monFichier']['name']); } else { echo "attaque upload !!! fic=".$_FILES['monFichier']['name']; } move_uploaded_file($_FILES['monFichier']['tmp_name'], "/chemin/destination/".$_FILES['monFichier']['name']);

27 Upload de fichiers Si vous utilisez copy, bien verifier que le fichier copié correspond à un fichier téléchargé avec is_uploaded_file et non un autre fichier : cela peut être dans certain cas un trou de sécurité. Avec PHP3, ou PHP4 quand register_globals=on dans php.ini, les informations contenues dans $_FILES, sont également disponibles dans des variables individuelles dont le nom commence par le nom du champs input file. $monFichier_name // = $_FILES['monfichier']['name'] $monFichier_type // = $_FILES['monfichier']['type'] $monFichier_size // = $_FILES['monfichier']['size'] $monFichier // = $_FILES['monfichier']['tmp_name'] Eviter d'utiliser ces variables, ou utiliser is_uploaded_file, pour des raisons impératives de sécurité !

28 Upload de fichier Objectif : Faire un formulaire qui propose l'upload d'une image. Dans la page cible, vérifier le type du fichier téléchargé, récupérer le fichier et le stocker dans un sous répertoire du site. Ensuite afficher l'image. Exo_upload_form.php Exo_upload.php

29 Traitement d'images PHP utilise une bibliothèque externe, GD, pour pouvoir générer les images. Il faut donc s'assurer en premier lieu (avec phpinfo() par exemple) que PHP soit configuré correctement : Soit compilé avec la bibliothèque GD Soit intègre le module GD via php.ini (extension=php_gd.dll ou php_gd.so) Depuis la version 1.6 de GD, il n'est plus possible de manipuler des images Gif (problème de licence). Il est possible d'utiliser un format similaire open source : PNG. PHP permet de générer à la volée des images dans différents formats. Cela est utile pour créer des graphes de statistiques issues d'une base de donnée, générer dynamiquement le format "vignette" des photos d'un album en ligne etc...

30 Traitement d'image ● Créer une image en mémoire, soit vierge (imagecreate), soit à partir d'un fichier image (imagecreatefromxxx où xxx = format) ● Utiliser les diverses fonctions pour dessiner, écrire dans cette image en mémoire (imagecolorallocate, imagestring, imageellipse, imagefill, imagerectangle etc…) ● enregistrer cette image mémoire sur disque ou l'envoyer directement au navigateur ● détruire l'image en mémoire (imagedestroy) Le principe est le suivant :

31 Traitement d'images Syntaxe de imagecreate : $Identifiant = imagecreate ( $largeur, $hauteur); imagecreate prend en argument 2 entiers indiquant la largeur et la hauteur. Renvoie un identifiant sur une image en mémoire dont le fond est blanc. On peut également créer une image à partir d'un fichier $identifiant = imagecreatefromjpeg( "fichier.jpg" ); $identifiant = imagecreatefrompng( "fichier.png" ); $identifiant = imagecreatefromgif( "fichier.gif" ); etc.. $im = imagecreate ( 200, 50 ); // créer une image de 200*50 exemple

32 Traitement d'images On "dessine" dans cette image grâce aux nombreuses fonctions disponibles, toujours en passant comme paramètre l'identifiant de l'image. Un paramètre souvent demandé est celui d'un code couleur que l'on peut récupérer grâce à imagecolorallocate : $codecouleur = imagecolorallocate( $im, $codeRouge, $codeVert, $codeBleu); Cette fonction ajoute une couleur dans la palette de couleur de l'image en question. Elle renvoie l'index de cette couleur dans la palette. Le premier appel à imagecolorallocate définit la couleur de fond de l'image.

33 Traitement d'images Formes géométriques imageellipse( image, x, y, larg, haut, couleur); imagepolygon( image, tableauPoint, nombrepoints, couleur); tableauPoint=array( x0, y0, x1, y1, …) imagerectangle( image, x1, y1, x2, y2, couleur); imageline( image, x1, y1, x2, y2, couleur); imagesetpixel( image, x, y, couleur); imagefilledellipse( image, x, y, larg, haut, couleur); imagefilledpolygon( image, tableauPoint, nombrepoints, couleur); imagefilledrectangle( image, x1, y1, x2, y2, couleur);

34 Traitement d'images Dessiner du texte imagestring(image, fonte, x, y, texte, couleur); Fonte est un identifiant de fonte (bitmap) chargé avec imageloadfont ou de fonte prédéfinie : de 1 à 5 Pour écrire avec une fonte TTF : imagettftext(image, taille, angle, x, y, couleur, chemin_fonte, texte);

35 Traitement d'images Une fois l'image construite, on appelle une des fonctions imagepng, imagegif, imagjpeg ou imagewbmp selon le format désiré. imageX(image [, nomfichier]); // X=png, jpeg, gif... Le paramètre nom de fichier est facultatif. S'il est présent, l'image est sauvegardée dans le fichier indiqué. <?php $im = imagecreate ( 100,50 ); $colfond = imagecolorallocate($im, 168,186,203); imagefill($im, 10,10,$colfond); $colrect = imagecolorallocate($im, 58, 47, 128); imagerectangle ($im, 5, 5, 95, 45,$colrect); $coltexte = imagecolorallocate($im, 255,255,255); imagestring ($im, 2, 20,15, "aston", $coltexte); imagepng($im, "logoaston.png"); imagedestroy($im) ?> Demo_logoaston.php

36 Traitement d'images Si un nom de fichier n'est pas indiqué, le contenu de l'image est directement envoyé vers le navigateur. Ce qui signifie que : ● il faut changer l'en-tête HTTP de la page en indiquant le bon type mime ● Ne rien écrire d'autre (pas d'echo, print et autre contenu HTML) <?php // page header("Content-type: image/png"); $im = imagecreate ( 100,50 ); //… imagestring ($im, 2, 20,15, $_GET['texte'], $coltexte); imagepng($im); ?> affichage image Voici l'image générée : Demo_buildlogo.php Demo_logo.php

37 Traitement d'images Objectif : Faire une page (exo_img_stat_build.php) qui génère une image représentant un graphe de statistique en barre à partir d'une série de valeur stockée dans une variable tableau. L'image doit être directement envoyée au navigateur. Exo_img_stat.php et exo_img_stat_build.php Bonus : ajouter un paramètre au script exo_img_stat_build.php pour indiquer si on veut un graphe en barre ou en ligne brisée L'afficher avec exo_img_stat.php

38 Envoi d'e-mails PHP permet d'envoyer un e-mail grâce à la fonction mail(). Mail(destinataire, sujet, message, entete_additionnels); <? mail("dupont@site.com", "confirmation d'inscription", "Nous confirmons l'inscription sur notre site..."); ?> Les en-têtes permettent de préciser des informations techniques. Chaque information doit être séparée par un \n <? // exemple d'en-têtes facultatifs $entete="From: Laurent \n"; $entete.="Cc: commercial@societe.com\n"; $entete.="Bcc: collegue@societe.com\n"; $entete.="Reply-to: webmaster@societe.com \n"; $entete.="X-Mailer: PHP/".phpversion()."\n"; mail("dupont@site.com", "confirmation d'inscription", "Nous confirmons l'inscription sur notre site...", $entete); ?>

39 Envoi d'e-mails Pour envoyer des e-mails au format HTML : <? $entete="MIME-Version: 1.0\n"; $entete.="Content-type: text/html; charset=iso-8859-1\n"; $entete.="From: Laurent \n"; $entete.="Reply-to: webmaster@societe.com \n"; $entete.="X-Mailer: PHP/".phpversion()."\n"; $contenu= " Confirmation "; $contenu.= "Nous confirmons votre inscription sur notre site"; $contenu.= " SOCIETE.COM "; $contenu.= " "; mail("dupont@site.com", "confirmation d'inscription", $contenu, $entete); ?>

40 Sécuriser un serveur PHP Un serveur web est particulièrement visé par des attaques pirates (qui ne viennent pas forcément de l'extérieur), car il héberge des sites et des applications sensibles. Celles-ci peuvent ne pas être suffisamment robustes et offrir des portes grandes ouvertes à toutes personnes voulant s'introduire dans le système ou récupérer des données sensibles. Il est possible de configurer PHP de manière à limiter les dégâts si une application possède une telle faille. Les paramètres de PHP se trouvent dans php.ini. On peut aussi changer ces paramètres pour chaque site hébergé, auquel cas, on les indique dans le fichier httpd.conf pour apache par exemple, dans chaque section, avec la directive php_admin_value ou php_value.

41 Sécuriser un serveur PHP Les options de configuration sont visibles avec la fonction phpinfo(). Il est utile de les connaître car leurs valeurs influencent le fonctionnement de bon nombre de fonctions, en particulier celles qui manipulent des fichiers. allow_url_fopen booleen : autorise ou non de manipuler des fichiers distants. Ex : fopen("http://www.site.com/page.htm"); open_basedir chemin : seul les fichiers se trouvant dans chemin pourront être accessible par les fonctions de fichiers (y compris include, require etc..). En règle général, dans php.ini, on fixe cette valeur avec le chemin du répertoire racine de tout les sites hebergés, et, dans le cas d'apache, on redéfinit open_basedir dans chaque. Ainsi, les scripts de chaque site ne peuvent aller lire les fichiers des sites voisins.

42 Sécuriser un serveur PHP magic_quote_gpc booleen : indique si lors de la réception des formulaires, les caractères ', ", et \ dans les champs de saisie sont échappés ou non avec le caractère \ post_max_size size : fixe la taille limite des données contenus dans un formulaire. A regarder s'il y a des problèmes lors d'upload de fichier. register_globals booleen : indique si les parametres GET, POST et COOKIE sont stockés dans des variables individuelles ou non. Pour des raisons de sécurité, il est préférable que la valeur soit false et d'utiliser les variables $_*. Dans les versions futures, cette option sera supprimée. track_vars booleen : permet l'utilisation des variables $_* ou $HTTP_*_VARS

43 Sécuriser un serveur PHP Safe mode Le mode "safe" a été introduit pour palier à de nombreux problèmes de sécurité. Quand safe_mode est à true, lorsque un script tente d'accéder à un fichier, il ne le peut que si le propriétaire du fichier est le même que le propriétaire du script. Certaines fonctions voient également leur comportement modifié et restreint. Voir la liste dans la documentation officielle: http://www.php.net/manual/en/features.safe-mode.php En particulier, cela peut poser problème pour les fichiers récupérés par upload. Ceux ci peuvent être enregistré avec le propriétaire du serveur web, et non avec le propriétaire du script. Du coup, ils ne peuvent plus être manipulés par la suite dans d'autres pages.

44 Sécuriser un site PHP Il se peut que l'on n'ait pas le contrôle total sur la configuration du serveur. Il est donc important de suivre quelques règles au niveau du développement pour limiter la casse. 1) Une règle avant tout : NE JAMAIS faire passer un nom de fichier en paramètre à une page. Celui-ci étant généralement ensuite manipulé (ouvert, copier, ou même détruit), cela peut poser d'énormes problèmes. exemple <? // mauvais_script.php include $_GET['fichier']; ?> Http://site.com/mauvais_script.php?fichier=/etc/passwd Même si c'est un bout d'un nom de fichier... <? // mauvais_script.php include "/chemin/vers/include/".$_GET['fichier']."inc".php; ?> Http://site.com/mauvais_script.php?fichier=../../../etc/passwd%00

45 Sécuriser un site PHP 2) toujours nommer ses fichiers avec l'extension.php, même les includes, pour éviter de voir leur code source affiché dans le navigateur si leur url est connu. Le mieux est de mettre tout les includes en dehors de l'arborescence du site : ils sont alors inaccessibles à partir d'un navigateur. 3) Dans la mesure du possible, vérifier dans les scripts le contenu des données reçues (par GET ou POST…). Si on attend par exemple un nombre, vérifier que c'est un nombre (is_numeric). Cela est d'autant plus important quand ces paramètres sont utilisés dans une requête SQL. <? // mauvais_script.php $sql="UPDATE matable SET nom='".$_GET['nom']."' WHERE id=".$_GET['id']; ?> mauvais_script.php?nom=toto&id=0%3B+DELETE+FROM+matable mauvais_script.php?nom=toto&id=0+AND+id+%3E+0

46 Sécuriser un site PHP 4) initialiser toutes les variables avec des valeurs par défaut avant leur utilisation. Quelque soit la technologie employée pour un site web, l'attitude à avoir en tant que développeur se résume en deux mot : soyez parano ! ;-)


Télécharger ppt "Développement PHP4 Programmation avancée. PHP niveau 2: le menu PHP niveau 2: le menu Programmation Objet Accès système de fichier Upload de fichiers."

Présentations similaires


Annonces Google