gestion de formulaires en php
DESCRIPTION
Présentation de la gestion des formulaires en PHP5TRANSCRIPT
Jean-Marie Renouard
LightPath 2014©
Le logo PHP est du domaine public http://commons.wikimedia.org/wiki/File:PHP-logo.svg
Ce document est licencié sous licence ◦ Attribution-NonCommercial-ShareAlike
◦ CC BY-NC-SA
Plus de détails: http://creativecommons.org/licenses/by-nc-sa/3.0/fr/
LightPath 2014© - http://www.jmrenouard.fr 2
Elément de sécurité au transfert
Validation côté client
Validation côté serveur
Format des données
Restriction des données
Formulaires anti-robots
Protection des données côté serveur
LightPath 2014© - http://www.jmrenouard.fr 3
2 types de formulaire
Structure d’un formulaire
Contenu d’un formulaire
Elément d’un formulaire
Cas de l’upload de fichiers
Récupération des données d’un formulaire
Récupération des fichiers uploadés
LightPath 2014© - http://www.jmrenouard.fr 4
LightPath 2014© - http://www.jmrenouard.fr 5
Formulaire type GET ◦ Récupération d’information
◦ Les éléments constituent les paramètres. ◦ <FORM METHOD=« GET » …
Formulaire type POST ◦ Envoi d’information
◦ Les éléments constituent les données à traiter. ◦ <FORM METHOD=« POST » …
LightPath 2014© - http://www.jmrenouard.fr 6
LightPath 2014© - http://www.jmrenouard.fr 7
METHOD: Méthode de transfert
ACTION: URL d’envoi
ENCTYPE: Type d’encodage
ELEMENTS: Ensemble d’élément du formulaire ◦ Zone d’échange d’information
◦ Ne sont transmis qu’à la validation du formulaire
LightPath 2014© - http://www.jmrenouard.fr 8
<FORM method=« post » action=« post.php">
Login: <INPUT type=« text » name=« login" />
<br/>
Password: <INPUT type=« password » name=« password" />
<br/>
<INPUT type="submit" value="Envoyer">
</FORM>
LightPath 2014© - http://www.jmrenouard.fr 9
LightPath 2014© - http://www.jmrenouard.fr 10
Les entrées
Les sélecteurs
Les zones de texte
LightPath 2014© - http://www.jmrenouard.fr 11
Une ligne de saisie
Déclaration du type d’entrée ◦ Attribut type
◦ <input type=« xxx »
Définition d’un nom à chaque entrée ◦ Attribut name
◦ <input name=« nom » …/>
LightPath 2014© - http://www.jmrenouard.fr 12
Assignation d’une valeur par défaut ◦ Attribut value
◦ <input value=« moi » …/>
Assignation d’une taille ◦ Attribut size
◦ <input size=« 10 » …/>
LightPath 2014© - http://www.jmrenouard.fr 13
Text: Saisie non masquée de texte
Password: Saisie masquée de texte
Hidden: Champ caché à l’affichage
File: Champ de sélection de fichier
LightPath 2014© - http://www.jmrenouard.fr 14
Radio: case type radio/choix exclusif
Checkbox: case type case à cocher
LightPath 2014© - http://www.jmrenouard.fr 15
submit: Bouton d’envoi de formulaire
reset: Bouton de remise à zéro
image: Bouton d’envoi de formulaire ◦ Attribut src
◦ <input type=« image » src=« envoi.png » …
LightPath 2014© - http://www.jmrenouard.fr 16
Menu type drop down <SELECT><option>…</option>…</SELECT>
Définition d’un nom du sélecteur ◦ <Select name=« menu » …</select>
Activation de la sélection multiple ◦ <Select multiple=« 1 » …</select>
LightPath 2014© - http://www.jmrenouard.fr 17
Une option d’un sélecteur
◦ <option>…</option>
Affectation d’un valeur à une option
◦ Attribut value
◦ <option value=« pierre »>Pierre</option>
Sélection par défaut
◦ Attribut selected
◦ <option SELECTED >Pierre</option>
LightPath 2014© - http://www.jmrenouard.fr 18
Zone de texte libre non masquée ◦ <TEXTAREA></TEXTAREA>
Définition d’un nom du sélecteur
◦ Attribut name
◦ <TEXTAREA name=« menu »></ TEXTAREA >
Définition de la taille en colonne et ligne
◦ Attributs cols et rows ◦ <TEXTAREA cols=« 10 » rows=« 10 » ></ TEXTAREA >
LightPath 2014© - http://www.jmrenouard.fr 19
LightPath 2014© - http://www.jmrenouard.fr 20
Entrée type file ◦ <input type=« file » name=«fichier »/>
La balise form avec un attribut enctype ◦ <form enctype=« multipart/form-
data »>…</form>
Autorisation de transmission en plusieurs
Requêtes HTTP (multipart ).
LightPath 2014© - http://www.jmrenouard.fr 21
Envoi de plusieurs valeurs
Utilisation des crochets dans l’attribut name ◦ <input name =« fichier[] » …>
◦ <input name =« fichier[] » …>
Valable pour toutes les types d’entrée ◦ Ex: option
LightPath 2014© - http://www.jmrenouard.fr 22
LightPath 2014© - http://www.jmrenouard.fr 23
Tout est dans le tableau $_GET Les attributs name des éléments servent
directement comme clé du tableau.
foreach ($_GET as $k => $v) echo « $k = $v »;
LightPath 2014© - http://www.jmrenouard.fr 24
Tout est dans le tableau $_POST Les attributs name des éléments servent
directement comme clé du tableau.
foreach ($_POST as $k => $v) echo « $k = $v »;
.
LightPath 2014© - http://www.jmrenouard.fr 25
LightPath 2014© - http://www.jmrenouard.fr 26
Tout est dans le tableau $_FILE Chaque entrée du tableau correspond à un fichier La clé est le nom de l’entrée Chaque élément du tableau contient:
◦ Le nom du fichier d’origine: $_FILES[‘fichier1’][‘name’] ◦ Le type mime : $_FILES[‘fichier1’][‘type’] ◦ La taille du fichier: $_FILES[‘fichier1’][‘size’] ◦ Le nom du fichier temporaire local: $_FILES[‘fichier1’][‘tmp_name’] ◦ Le code d’erreur du fichier : $_FILES[‘fichier1’][‘error’]
.
LightPath 2014© - http://www.jmrenouard.fr 27
LightPath 2014© - http://www.jmrenouard.fr 28
Passage en HTTPS
Le site est souvent en HTTPs intégral.
<form ACTION=« https://serveur.com/post.php » …></form>
LightPath 2014© - http://www.jmrenouard.fr 29
LightPath 2014© - http://www.jmrenouard.fr 30
Réalisation par script JS
Peu fiable ( attaque )
Inutile si Javascript désactivé
Facilitation de contournement.
LightPath 2014© - http://www.jmrenouard.fr 31
<form onsubmit="return valide_form ( );" …>
A l’envoi, la fonction valide_form est invoqué: ◦ Si true est renvoyé par la méthode JS, le formulaire
est envoyé.
◦ Sinon, il faut effectuer une nouvelle soumission.
LightPath 2014© - http://www.jmrenouard.fr 32
<form name=« formulaire» method="post" action=« post.php" onsubmit="return valide_form ( );">
<h1>Entrer Votre Nom</h1> <p>Votre Nom: <input type="text"
name="nom"></p> <p><input type="submit" name="send"
value=« Envoyer"></p> </form>
LightPath 2014© - http://www.jmrenouard.fr 33
<script type="text/javascript"> <!– function valide_form ( ) {
valid = true; if ( document.formulaire.nom.value == "" ) {
alert ( « Remplisser le nom." ); valid = false;
} return valid; } //-->
</script>
LightPath 2014© - http://www.jmrenouard.fr 34
LightPath 2014© - http://www.jmrenouard.fr 35
Fiable car contrôlé par l’application L’utilisateur ne peut altérer le comportement. Il peut le détourner seulement.
Si les données ne sont pas correctes,
◦ Pas de traitement des données ◦ Renvoi d’un nouveau formulaire avec les erreurs
LightPath 2014© - http://www.jmrenouard.fr 36
LightPath 2014© - http://www.jmrenouard.fr 37
Vérification de la taille des chaînes ◦ if (count($_POST[‘nom’] > 255) { …}
Vérification du type ◦ is_array, is_bool, is_callable, is_double, is_float,
is_int, is_integer, is_long, is_null, isset, is_numéric, is_object, is_real, is_resource, is_scalar, is_string
LightPath 2014© - http://www.jmrenouard.fr 38
Vérification format email: ◦ if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-
]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)){ …}
Vérification d’une date ◦ If (!preg_match( '`^\d{1,2}/\d{1,2}/\d{4}$`' , $value
) ) {…}
LightPath 2014© - http://www.jmrenouard.fr 39
La fonction filter_var permet la validation de certains formats: ◦ FILTER_VALIDATE_BOOLEAN
◦ FILTER_VALIDATE_EMAIL
◦ FILTER_VALIDATE_FLOAT
◦ FILTER_VALIDATE_INT
◦ FILTER_VALIDATE_IP
◦ FILTER_VALIDATE_REGEXP
◦ FILTER_VALIDATE_URL
LightPath 2014© - http://www.jmrenouard.fr 40
LightPath 2014© - http://www.jmrenouard.fr 41
$allow=array(‘nom ’, ‘comments’);
foreach ($_POST as $key => $val) {
if (! in_array($allow, $key) {
unset($_POST[$key]);
}
}
LightPath 2014© - http://www.jmrenouard.fr 42
LightPath 2014© - http://www.jmrenouard.fr 43
Utilisation d’un catcha
Image avec formulaire de saisie
Blocage de tous les robots sans OCR.
Élimination de 99% des spams
LightPath 2014© - http://www.jmrenouard.fr 44
Génération d’une chaîne aléatoire
Stockage de la clé MD5 de la chaîne en SESSION ($_SESSION)
Création de l’image de la chaîne
Envoi du résultat.
LightPath 2014© - http://www.jmrenouard.fr 45
Récupération de la valeur du catcha
Calcul de la clé MD5 de la valeur
Comparaison avec la valeur en session.
Si pas identique, régénérer une image.
Si identique, supprimer l’entrée en session
LightPath 2014© - http://www.jmrenouard.fr 46
LightPath 2014© - http://www.jmrenouard.fr 47
Retrait de tous les caractères sensibles
Encodage des caractères sensibles
But est d’éviter les attaques: ◦ Empêcher les attaques de XSS
Risques: ◦ Redirection ◦ Vol d’information ◦ Ralentissement ◦ Exécution d’action non désirée en fond
LightPath 2014© - http://www.jmrenouard.fr 48
Retrait de balises HTML: strip_tags
Encodage html: htmlentities
Encode url: urlencode
LightPath 2014© - http://www.jmrenouard.fr 49
La fonction filter_var permet l’épuration ◦ FILTER_SANITIZE_EMAIL ◦ FILTER_SANITIZE_ENCODED ◦ FILTER_SANITIZE_MAGIC_QUOTES ◦ FILTER_SANITIZE_NUMBER_FLOAT ◦ FILTER_SANITIZE_NUMBER_INT ◦ FILTER_SANITIZE_SPECIAL_CHARS ◦ FILTER_SANITIZE_STRING ◦ FILTER_SANITIZE_STRIPPED ◦ FILTER_SANITIZE_URL ◦ FILTER_UNSAFE_RAW
LightPath 2014© - http://www.jmrenouard.fr 50
Documentation du PHP http://www.php.net/docs
LightPath 2014© - http://www.jmrenouard.fr 51
LightPath: ◦ Société de conseil et d’ingénierie
◦ Formations, Conseil, Audit et mise en œuvre
Jean-Marie RENOUARD ◦ [email protected]
◦ Twitter: @jmrenouard
◦ http://www.jmrenouard.fr
LightPath 2014© - http://www.jmrenouard.fr 52