PHP - Initiation. Formulaires et transmission de données. VIII) Formulaires et transmission de données



Documents pareils
TP JAVASCRIPT OMI4 TP5 SRC

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Introduction. PHP = Personal Home Pages ou PHP Hypertext Preprocessor. Langage de script interprété (non compilé)

Création de formulaires interactifs

Formulaire pour envoyer un mail

API SMS CONSEIL HTTP V2.01. Sommaire. Documentation V1.0 au 21/05/2011

Stockage du fichier dans une table mysql:

UTILISATION DE L'APPLICATION «PARTAGE DE FICHIERS EN LIGNE»

3 : créer de nouveaux onglets dans Netvibes Cliquer sur le bouton «+» et renommer le nouvel onglet (par exemple Encyclopédies en ligne)

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Application de lecture de carte SESAM-Vitale Jeebop

Comment développer et intégrer un module à PhpMyLab?

1. Installation du Module

Dans l'article précédent, vous avez appris

Guide d implémentation. Réussir l intégration de Systempay

Programmation Web TP1 - HTML

Attaques de type. Brandon Petty

Programmation Web. Madalina Croitoru IUT Montpellier

Manuel du composant CKForms Version 1.3.2

Module BD et sites WEB

SYSTEME DE GESTION DES ENERGIES EWTS EMBEDDED WIRELESS TELEMETRY SYSTEM

Gilles.Roussel univ-mlv.fr HTTP/1.1 RFC 2068

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

Keyyo Guide de mise en service CTI / API / TAPI Keyyo

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

NOTICE TELESERVICES : Créer mon compte personnel

Guide de démarrage rapide Centre de copies et d'impression Bureau en Gros en ligne

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

INSTALLATION ET CONFIGURATION D'UN SERVEUR WEB SUR MAC OS X

DOM - Document Object Model

Sommaire Accès via un formulaire d'identification... 4 Accès en mode SSO... 5 Quels Identifiant / mot de passe utiliser?... 6

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Effectuer des changements par lots avec BCDI abonnement

Live box et Nas Synology

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

MEDIAplus elearning. version 6.6

Formulaires et Compteurs

Formation. Module WEB 4.1. Support de cours

Qlik Sense Cloud. Qlik Sense Copyright QlikTech International AB. Tous droits réservés.

Attaques applicatives

TP Service HTTP Serveur Apache Linux Debian

CREATION d UN SITE WEB (INTRODUCTION)

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

1. Introduction Création d'une requête...2

Editer un script de configuration automatique du proxy

VM Card. Manuel des paramètres des fonctions étendues pour le Web. Manuel utilisateur

Manuel d'installation

Module http MMS AllMySMS.com Manuel d intégration

Types MIME (2) Typage des ressources Internet. Les URI. Syntaxe dans les URI. Possibilité de spécifier un paramètre du sous-type

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

Affichage de la date d'exigibilité sur les documents FAQ INV 011

Travail collaboratif avec OpenOffice Texte (Writer)

Installation et paramétrage. Accès aux modèles, autotextes et clip- art partagés

Sauvegarder et restaurer les données PMB

FOIRE AUX QUESTIONS PAIEMENT PAR INTERNET. Nom de fichier : Monetico_Paiement_Foire_aux_Questions_v1.7 Numéro de version : 1.7 Date :

Guide de configuration de la Voix sur IP

NAMEBAY PRO. votre site de revente de noms de domaine en marque blanche. Documentation technique

Formation > Développement > Internet > Réseaux > Matériel > Maintenance

Sessions en ligne - QuestionPoint

.NET - Classe de Log

2 LES BASES DU HTML 19 Qu est-ce que le HTML? 20 De quand date le HTML? 20 Écrire son propre code HTML 22

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Création, analyse de questionnaires et d'entretiens pour Windows 2008, 7, 8 et MacOs 10

Le serveur SLIS - Utilisation de base

Comment faire pour créer ses propres pages html?

Le stockage local de données en HTML5

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Rafraichissement conditionné d'une page en.net

Séance d ED n 5 : HTML et JavaScript

Sommaire. Avertissement :

Petit guide à l'usage des profs pour la rédaction de pages pour le site Drupal du département

Programmation Web. Introduction

Plateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.

ISPConfig Documentation

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Assistance à distance sous Windows

SYSTÈMES D INFORMATIONS

Manuel utilisateur. des. listes de diffusion. Sympa. l'université Lille 3

Création d'un questionnaire (sondage)

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Compte-rendu de projet de Système de gestion de base de données

Google Tag Manager. «Vous ne verrez plus l'analytics de la même manière» par Ronan CHARDONNEAU

\ \ / \ / / \/ ~ \/ _ \\ \ ` \ Y ( <_> ) \ / /\ _ / \ / / \/ \/ \/ Team

Guide utilisateur Archivage intermédiaire Messagerie. Enterprise Connect pour Outlook 2010 EC V 1.0

Création d un formulaire de contact Procédure

Activités HTML. Code: act-html

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Paramétrage des navigateurs

Paginer les données côté serveur, mettre en cache côté client

Pour paramétrer l'extranet Pré-inscription, sélectionner Pré-inscriptions dans le menu Paramètre.

Printer Administration Utility 4.2

Logiciel : GLPI Version : SYNCRHONISATION DE GLPI AVEC ACTIVE DIRECTORY. Auteur : Claude SANTERO Config. : Windows 2003.

SECURITY ADVISORY VULNERABILITE SUR LES DONNEES CLIENTS MAGENTO

INCORPORER EXCEL EN LIGNE DANS UN FICHIER CRÉÉ AVEC L ÉDITEUR DE TEXTE 15 avril 2015

Manuel de l administrateur

Failles des applications Web. Ce document est extrait du travail de diplôme de M. DIZON dans l état.

WEB & DÉVELOPPEMENT LES BASES DU WEB LE LANGAGE HTML FEUILLES DE STYLES CSS HISTORIQUE D INTERNET ET DU WEB LES DIFFÉRENTS LANGAGES

Transcription:

VIII) Formulaires et transmission de données

VIII.1) Formulaires Les formulaires sont un outil primordial lors du développement d'un applicatif Web. C'est grace à eux que l'utilisateur va pouvoir transmettre des informations et ainsi réaliser n'importe quelle action pouvant être exécutée par un script. VIII.1.1) Balise FORM Tout formulaire HTML commence et se termine par cette balise. Les champs permettant de transmettre les informations seront à l'intérieur. Syntaxe <form> champs </form>

Ces champs (aussi appelés 'widgets') peuvent prendre différentes formes : zones de texte, menus, cases à cocher... Afin de transmettre son information, chaque widget possède un nom auquel est associé une valeur. (Un peu comme une variable) VIII.1.2) Balise INPUT TEXT <input type='text' name='montexte'> Mis à part les attributs type et name (obligatoires si l'on veut transmettre correctement) il en existe de très nombreux autres. value size maxlength readonly initialise la valeur du champ modifie la largeur du champ (nbr de caractères) limite le nombre de caractères pouvant être renseignés empêche la modification du contenu ('true' ou 'false')

VIII.1.3) Balise INPUT PASSWORD <input type='password' name='motdepasse'> C'est une variante à la balise text qui permet de passer un mot de passe : le comportement et les caractéristiques sont les mêmes mais le contenu tapé par l'utilisateur n'apparait pas en clair, chaque caractères étant remplacé par un petit symbole. VIII.1.4) Balise TEXTAREA <textarea name='longtexte'><textarea> C'est une zone de texte multiligne. Les données à transmettre sont contenues entre les 2 balises. rows cols permet de modifier la taille en nombre de lignes permet de modifier la taille en nombre de colonnes

VIII.1.5) Balise SELECT <select name='maliste'> <option value='valeur1'></option> <option value='valeur2'></option> <option value='valeur3'></option>... </select> Ce widget permet de construire des menus déroulants. Le nom est défini dans la balise SELECT tandis que les différentes valeurs possibles sont passées dans les balises OPTION. Les textes illustrant les choix possibles sont eux placés à l'intérieur des balises. selected permet de prédéfinir un choix ('true')

Par défaut un seul choix peut être fait par l'utilisateur. Il est cependant possible de permettre des choix multiples avec l'attribut multiple que l'on déclare dans la balise SELECT. multiple size permet d'autoriser les choix multiples ('true') détermine combien d'options sont visibles par défaut Dans le cas de choix multiples, les valeurs des choix seront envoyées sous forme de tableau. Nous devons donc rajouter des [] (crochets) au nom de notre SELECT. <select name='maliste[]' multiple='true'> <option value='valeur1'></option> <option value='valeur2'></option> <option value='valeur3'></option>... </select>

VIII.1.6) Balise INPUT CHECKBOX <input type='checkbox' name='macheckbox'> Permet de réaliser une case à cocher. Chaque clic permet de cocher/décocher le widget. Attention : seules les valeurs des cases cochées sont transmises! Si la valeur n'est pas précisée, la valeur transmise sera 'on'. Il est possible d'envoyer plusieurs valeurs associées au nom de notre widget. Pour cela on utilise le même nom dans nos cases en ajoutant des [] (crochets). <input type='checkbox' name='macheckbox[]' value='val1'> <input type='checkbox' name='macheckbox[]' value='val2'> <input type='checkbox' name='macheckbox[]' value='val3'> checked permet de précocher des cases ('true')

VIII.1.7) Balise INPUT RADIO <input type='radio' name='monradio'> Ce widget seul n'a aucun interêt, il s'utilise tout le temps en configuration 'multiple'. En effet seul, le bouton radio une fois coché ne peut plus se décocher. En l'associant à d'autre, il permet de faire un choix unique entre eux en 'switchant'. On utilise le même nom dans nos radio en ajoutant des [] (crochets). <input type='radio' name='monradio[]' value='val1'> <input type='radio' name='monradio[]' value='val2'> <input type='radio' name='monradio[]' value='val3'> checked permet de précocher un radio ('true')

VIII.1.8) Balise INPUT HIDDEN <input type='hidden' name='mavalinvisible' value='val'> Ce widget permet de transmettre une information de notre choix de manière 'invisible'. Attention : le widget n'apparait pas pour l'utilisateur mais s'il observe le code de la page le contenant, il pourra tout à fait lire la donnée transmise. Ce widget ne doit donc pas être utilisé pour faire passer des informations cruciales nécessitant un minimum de sécurité. On l'utilisera pour transmettre toute donnée ne nécessitant pas un choix de la part de l'utilisateur.

VIII.1.9) Balises INPUT SUBMIT, RESET et BUTTON <input type='submit' value='envoyer'> Ce widget fait apparaitre un bouton dont le clic envoi le formulaire. <input type='reset' value='effacer'> Ce widget fait apparaitre un bouton donc le clic réinitialise le formulaire à ses valeurs par défaut. <input type='button' value='bouton'> Ce widget fait apparaitre un bouton neutre : un clic sur ce dernier ne génère aucune action. Son interêt est que nous pourrons lui associer du code (JS ou jquery en général) qui nous permettra de lancer une action de notre choix.

VIII.2) Transmission de données Maintenant que nous savons construire un formulaire et récupérer des informations auprès de l'utilisateur, voyons comment transmettre ces dernières à un script PHP qui pourra les traiter. VIII.2.1) Destination C'est à l'intérieur de la balise FORM que nous allons préciser où envoyer ces données grace à l'attribut action. <form action='fichier'> Notes : - Si l'on ne précise pas le fichier de destination, les données sont envoyées à la page elle-même. - Il est tout à fait possible d'appeller un script sur un autre serveur.

VIII.2.2) Méthode GET Il existe principalement 2 façons de transmettre les données. Celle par défaut s'appelle GET. (Elle s'applique si l'on ne précise rien) <form name='nom' action='fichier' method='get'> Les données sont transmises 'en clair' dans l'url, c'est à dire qu'on peut les lire sans problèmes à travers ce qu'on appelle la 'query string'. Elle commence par un? (point d'interrogation) juste après le nom du fichier de destination puis suivent les couples nom=valeur séparés par des & (esperluette). Exemple : mon_script.php?banane=4&pomme=1&ananas=3

Cette méthode est souvent utilisée pour débuguer ou tester son code mais rarement pour transmettre des données et ce, principalement pour 2 raisons : Manque de sécurité : toutes les informations transmises sont lisibles dans l'url. Limitation de taille : les navigateurs limitent la taille maximum de la 'query string'. (en général entre 256 et 512 caractères) URL encodage : certains caractères doivent être encodés dans l'url. Cela est fait automatiquement par le formulaire mais si l'on souhaite nous même la générer, les choses se compliquent. Exemples : prenom=éric devient prenom=%c3%89ric texte=bonjour à tous devient texte=bonjour+%c3%a0+tous operateur=b&you devient operateur=b%26you

VIII.2.3) Méthode POST <form action='fichier' method='post'> Avec cette méthode, les données sont transmises dans l'entête HTTP de manière masquée. Attention : masquée ne veut pas dire cryptée (comme avec le protocole HTTPS) ce qui signifit qu'une personne mal intentionnée et qui s'y connait un minimum pourra intercepter et lire vos informations. De plus cette méthode permet d'envoyer en théorie une quantité d'informations illimitée et c'est la seule qui autorise l'envoi de fichiers en précisant dans la balise form un nouvel attribut pour l'encodage : enctype <form action='fichier' method='post' enctype='multipart/formdata'>

VIII.2.4) Récupération La récupération des données en provenance d'un formulaire est d'une simplicité déconcertante. Il existe des genres de super variables qui contiennent tout simplement ces données. $_GET Fonctionne comme un tableau associatif dont chaque mot-clé correspond à un nom de champ (name) et auquel est bien évidemment associé la valeur correspondante. Il existe l'équivalent pour les données passées en POST : $_POST Il existe même une variante qui contient les 2 : $_REQUEST (Cette dernière contient également les infos des cookies mais laissons ça de côté pour l'instant...)

Exemple : HTML <form action='traitement.php' method='get'> <input type='text' name='prenom'> <input type='text' name='nom'> <input type='submit' value='envoi'> </form> PHP <?php $prenom = $_GET['prenom']; $nom = $_GET['nom']; echo 'Bonjour '.$prenom.' '.$nom;?> Cela fonctionnera exactement de la même manière avec $_POST ou $_REQUEST.

Certaines données peuvent être envoyées sous forme de tableau. C'est le cas par exemple pour des checkbox associés ou un liste de sélection à choix multiple. Rien ne change côté PHP, on récupère de la même manière nos informations, il faut juste bien garder en tête que nous traitons alors un tableau. HTML <form action='traitement.php' method='get'> <input type='checkbox' name='option[]' id='option1' value='1'>rouge <input type='checkbox' name='option[]' id='option2' value='2'>vert <input type='checkbox' name='option[]' id='option3' value='3'>bleu <input type='submit' value='envoi'> </form>option PHP <?php $options = $_GET['option']; print_r($options);?>

VIII.2.5) Vérifications et validations Il peut arriver dans certains cas que le script PHP tente de récupérer la valeur d'un champ qui n'a pas été transmis (notamment dans le cas d'une checkbox non cochée), ce qui va générer une erreur. Afin d'éviter cela, il est d'usage de vérifier l'existence d'une variable avant récupération grace à la fonction isset() var_dump(isset($test)); $test = 'ok'; var_dump(isset($test)); // va afficher : bool(false) // va afficher : bool(true) En appliquant cela à un traitement de case à cocher : if (isset($_get['accord'])) { $accord = 'oui'; } else { $accord = 'non'; }

Attention : Les select en mode 'sélection multiple', les checkbox et les radio ne renvoient rien si l'utilisateur n'a fait aucun choix ou que les cases sont décochées. Les tests avec isset() deviennent primordiaux! empty(variable) Cette fonction alternative permet de vérifier non seulement l'existence d'une variable, comme isset(), mais également le fait qu'elle ne soit pas vide. Les vérifications javascript côté client pouvant être désactivées ou carrément modifiées, elles ne suffisent pas à assurer la récupération correcte des données souhaitées. Tous les tests devront être doublés côté serveur, en PHP. (taille minimum ou maximum d'un texte, type de donnée, plage correcte, validité d'une adresse email, respect d'un format particulier...)

VIII.3) Transmission de fichiers VIII.3.1) Envoi (formulaire HTML) Il nous faut avant tout modifier l'encodage dans la balise form avec l'attribut enctype : <form action='fichier' method='post' enctype='multipart/formdata'> Il nous reste ensuite à créer un input de type file pour permettre à l'utilisateur de choisir un fichier : <input type='file' name='monfichier'> Il est bien évidemment possible d'envoyer plusieurs fichiers d'un coup. ATTENTION : Le temps d'attente de l'upload va s'allonger...

VIII.3.2) Réception (PHP) Lorsque le formulaire est soumis, le fichier est téléchargé sur le serveur hébergeant le formulaire, dans un dossier temporaire. Il ne se passe rien d'autre : A nous de choisir ce qu'on fait de ce fichier. Nous allons utiliser la super variable $_FILES pour récupérer toutes les informations utiles sur les fichiers qui viennent d'être téléchargés : $_FILES['monfichier']['tmp_name'] Le nom et l'emplacement temporaire du fichier $_FILES['monfichier']['name'] Le nom original du fichier $_FILES['monfichier']['type'] Son type MIME (image/gif, application/pdf...)

$_FILES['monfichier']['size'] Sa taille en octets (1 000 000 octets = 1Mo pour faire simple) $_FILES['monfichier']['error'] Contient 0 (zéro) si tout s'est bien passé sinon un code d'erreur. VIII.3.3) Traitement (PHP) Tout comme pour les données plus classiques reçues d'un formulaire, il nous faut procéder à toute une batterie de test avant de valider le fichier. Le fichier existe t-il? if (isset($_files['monfichier'])) { // Ici on continu... }

Le téléchargement s'est-il bien passé? if ($_FILES['monfichier']['error'] == 0) { // Ici on continu... } La taille ne dépasse t'elle pas la limite fixée? if ($_FILES['monfichier']['size'] < 2000000) { // Ici on continu... } Le type du fichier est-il celui attendu? if ($_FILES['monfichier']['type'] == 'image/png') { // Ici on continu... } ATTENTION : le type se base juste sur le nom de l'extension, on peut facilement tricher en la changeant.

Lorsque tout est bon, on va accepter le fichier et le copier où bon nous semblera grace à une fonction dédiée : move_uploaded_file(chemin_temporaire, chemin_final) Lorsqu'on défini le chemin final pour notre fichier, nous pouvons reprendre son nom original mais rien ne nous empêche de le renommer. Exemples : move_uploaded_file($_files['monfichier']['tmp_name'], 'download/fichier.txt'); move_uploaded_file($_files['monfichier']['tmp_name'], 'download/'.$_files['monfichier'] ['name']);

VIII.4) Sécurité Les formulaires font partie des points les plus vulnérables des applications web. Si certaines failles sont facilement évitées, d'autres peuvent poser plus de problèmes et demander un attention particulière. Les informations que nous collectons provenant de l'extérieur, nous devons absolument les vérifier avant de les valider. VIII.4.1) Défenses au niveau du HTML L'utilisateur pouvant voir le code et même le copier pour l'utiliser depuis une de ses pages, tout ce que nous essaierons de faire dans notre formulaire HTML ne peut être considéré comme sûr. Utiliser l'attribut max_file_size pour limiter la taille d'un fichier à envoyer peut être contourné, tout comme un input de type hidden peut être lu.

La seule chose primordiale à éviter est l'utilisation de la méthode get si on veut garder un minimum de confidentialité des données. Mais là encore, des logiciels permettant la lecture des entêtes HTTP d'une requête en post sont malheureusement à la portée de n'importe qui aujourd'hui. VIII.4.2) Défenses au niveau du script Comme pour le HTML, les scripts étant côté client ils pourront facilement être contournés ou supprimés. Ils doivent être présent pour le confort de l'utilisateur et pour pallier aux erreurs ou tentatives malveillantes naïves.

VIII.4.3) Défenses au niveau du PHP Ce n'est véritablement qu'ici que nous allons pouvoir agir efficacement contre les tentatives mal intentionnées et les erreurs. Tester l'existence if (isset($_post['prenom'])) { // Cette variable existe } else { // Cette variable n'existe pas } Tester une valeur non vide if ($_POST['prenom']!='') { // Cette variable n'est pas vide } else { // Cette variable est vide }

Tester le type if (is_string($_post['prenom'])) { // Cette variable est bien une chaîne de caractère } else { // Cette variable n'est pas une chaîne de caractère } Tester le type va être très important surtout si l'on veut stocker ces informations dans une base de donnée. On a des équivalents pour tous les types : - is_int() entier - is_float() nombre décimal - is_numeric entier ou décimal - is_bool() booléen - is_array() tableau...

Tester la taille Pas assez utilisé dans les vérifications de données entrante, tester la taille d'une variable est pourtant simple et efficace. Par exemple refuser les prénoms qui auront plus de 25 caractères. if (strlen($_post['prenom'])>25) { // Cette variable est trop longue } else { // Cette variable à une taille correcte } Valeurs par défaut Se débrouiller pour toujours avoir une valeur est une bonne pratique. if ((isset($_post['prenom']) && ($_POST['prenom']!='')) { // On récupère la valeur passée } else { // On attribue une valeur par défaut, par exemple 'inconnu' }

Tester avec des REGEXP Les expressions régulières sont parfaites pour vérifier les informations qui doivent respecter un format bien précis exigé. $regexp = "/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/" if (preg_match($regexp, $_POST['email']) { // Email valide } else { // Email non valide } Tester avec filter_var Extension désormais native depuis PHP 5.2, permet de faire de nombreuses vérifications bien pratiques! if (filter_var($_post['email'], FILTER_VALIDATE_EMAIL) { // Email valide } else { // Email non valide }

Contrer les injections Dans un champs texte par exemple, au lieu de simplement placer une chaine de caractère inoffensive, nous allons placer ce code : '><script>alert('boum!')</script> Ou celui-ci : '><a href='http://www.google.fr'>mon site</a><img src='pirate.gif' title='ah ah ah En utilisant un code HTML/PHP classique nous constatons rapidement qu'il y a un problème : <input type='text' name='prenom' value='<?php echo $prenom;?>'> En effet, tous les caractères ont été insérés et certains sont interprétés par le HTML, changeant par là même le code d'origine. Pour éviter celà, nous devons transformer tous les caractères spéciaux HTML des informations que nous recevons.

htmlspecialchars(chaîne, options) Cette fonction renvoi la chaîne passée en encodant en HTML tout ce qui peux poser problème. Parmis les nombreuses options, deux nous intéressent particulièrement : ENT_COMPAT ENT_QUOTES Convertit les guillemets doubles, ignore les simples Convertit les guillemets doubles et simples $test = "'><script>alert('boum!')</script>"; echo htmlspecialchars($test, ENT_QUOTES); // Va afficher : &#039;><script>alert(&#039;BOUM!&#039;)</script>