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 oeuvre 
◦jmrenouard@lightpath.fr 
Jean-Marie RENOUARD 
◦jmrenouard@gmail.com 
◦Twitter: @jmrenouard 
◦http://www.jmrenouard.fr 
LightPath 2014© - http://www.jmrenouard.fr 
52

Gestion de formulaires en PHP

  • 1.
  • 2.
    Le logo PHPest 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
  • 3.
    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
  • 4.
    2 types deformulaire 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
  • 5.
    LightPath 2014© -http://www.jmrenouard.fr 5
  • 6.
    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
  • 7.
    LightPath 2014© -http://www.jmrenouard.fr 7
  • 8.
    METHOD: Méthode detransfert 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
  • 9.
    <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
  • 10.
    LightPath 2014© -http://www.jmrenouard.fr 10
  • 11.
    Les entrées Lessélecteurs Les zones de texte LightPath 2014© - http://www.jmrenouard.fr 11
  • 12.
    Une ligne desaisie 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
  • 13.
    Assignation d’une valeurpar défaut ◦Attribut value ◦<input value=« moi » …/> Assignation d’une taille ◦Attribut size ◦<input size=« 10 » …/> LightPath 2014© - http://www.jmrenouard.fr 13
  • 14.
    Text: Saisie nonmasqué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
  • 15.
    Radio: case typeradio/choix exclusif Checkbox: case type case à cocher LightPath 2014© - http://www.jmrenouard.fr 15
  • 16.
    submit: Bouton d’envoide 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
  • 17.
    Menu type dropdown <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
  • 18.
    Une option d’unsé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
  • 19.
    Zone de textelibre 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
  • 20.
    LightPath 2014© -http://www.jmrenouard.fr 20
  • 21.
    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
  • 22.
    Envoi de plusieursvaleurs 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
  • 23.
    LightPath 2014© -http://www.jmrenouard.fr 23
  • 24.
    Tout est dansle 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
  • 25.
    Tout est dansle 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
  • 26.
    LightPath 2014© -http://www.jmrenouard.fr 26
  • 27.
    Tout est dansle 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
  • 28.
    LightPath 2014© -http://www.jmrenouard.fr 28
  • 29.
    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
  • 30.
    LightPath 2014© -http://www.jmrenouard.fr 30
  • 31.
    Réalisation par scriptJS Peu fiable ( attaque ) Inutile si Javascript désactivé Facilitation de contournement. LightPath 2014© - http://www.jmrenouard.fr 31
  • 32.
    <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
  • 33.
    <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
  • 34.
    <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
  • 35.
    LightPath 2014© -http://www.jmrenouard.fr 35
  • 36.
    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
  • 37.
    LightPath 2014© -http://www.jmrenouard.fr 37
  • 38.
    Vérification de lataille 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
  • 39.
    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
  • 40.
    La fonction filter_varpermet 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
  • 41.
    LightPath 2014© -http://www.jmrenouard.fr 41
  • 42.
    $allow=array(‘nom ’, ‘comments’); foreach ($_POST as $key => $val) { if (! in_array($allow, $key) { unset($_POST[$key]); } } LightPath 2014© - http://www.jmrenouard.fr 42
  • 43.
    LightPath 2014© -http://www.jmrenouard.fr 43
  • 44.
    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
  • 45.
    Génération d’une chaînealé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
  • 46.
    Récupération de lavaleur 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
  • 47.
    LightPath 2014© -http://www.jmrenouard.fr 47
  • 48.
    Retrait de tousles 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
  • 49.
    Retrait de balisesHTML: strip_tags Encodage html: htmlentities Encode url: urlencode LightPath 2014© - http://www.jmrenouard.fr 49
  • 50.
    La fonction filter_varpermet 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
  • 51.
    Documentation du PHP http://www.php.net/docs LightPath 2014© - http://www.jmrenouard.fr 51
  • 52.
    LightPath: ◦Société deconseil et d’ingénierie ◦Formations, Conseil, Audit et mise en oeuvre ◦jmrenouard@lightpath.fr Jean-Marie RENOUARD ◦jmrenouard@gmail.com ◦Twitter: @jmrenouard ◦http://www.jmrenouard.fr LightPath 2014© - http://www.jmrenouard.fr 52