Kommunauty
Connexion
Inscription

Gestion de formulaires en php

le 7 octobre 2011 • Programmation • par NicoBelo

Bonjour à tous, ceci est mon premier tutoriel pour Kommunauty. Nous apprendrons dans celui-ci à gérer les formulaires internet qui sont très souvent la source de failles de sécurités pour un site. De plus, nous verrons toutes les vérifications possibles et les éventuelles failles qui pourraient nuire au bon fonctionnement.

Nous n'apprendrons non pas à créer un formulaire, mais plutôt à gérer les informations qui seront postées et à la fois réceptionnées avec du PHP.

Exemple d'un formulaire en langage HTML

Je vous met ci-dessous l'exemple d'un formulaire avec deux champs de texte (Courriel et Pseudo). Nous utiliserons ce formulaire durant toute la continuité de ce tutoriel pour les exemples et les démonstrations.

Contenu de notre page index.php

<form method="post" action="envoi.php">

    <input type="text" name="courriel" />
    <input type="text" name="pseudo" />

    <input type="submit" name="envoyer" />

</form>

Vous avez vu que notre formulaire ci-dessus était très basique. Il transmettra les informations entrées vers la page envoi.php en utilisant la méthode POST.

Vérifier que les champs ne sont pas vide

Nous allons premièrement vérifier que le formulaire n'a pas été soumis à perte. C'est à dire que nous vérifierons si les champs de notre formulaire ne sont pas vide. Nous verrons deux méthodes différentes.

Voici la première méthode que je vous propose d'essayer :<br />Contenu de notre page envoi.php

<?php
if($_POST["courriel"] == "" || $_POST["pseudo"] == "") {
    echo "Vous devez compléter tous les champs du formulaire";
}
?>

Et oui, ce petit bout de code permet de vérifier que les deux champs de notre formulaire ne sont pas vide. Seulement, cette méthode n'est pas la meilleure selon moi puisqu'il suffirait de mettre un simple espace dans l'un des champs pour dire qu'il est complété.


Nous utiliserons alors alors cette deuxième méthode plus simple et fonctionnelle :<br />Contenu de notre page envoi.php

<?php
if(empty($_POST["courriel"]) || empty($_POST["pseudo"])) {
    echo "Vous devez compléter tous les champs du formulaire !";
}
?>

Vous savez maintenant comment vérifier si un champ est complété ou nom.

Mais d'où sont postées les données ?

Et oui, je voulais aborder cette partie dans mon tutoriel puisque beaucoup de sites ne pensent pas à faire cette vérification qui est quand même assez importante selon moi.

Nous allons vérifier que les informations transmises proviennent bien d'un formulaire de notre site et non pas d'un source externe. Je m'explique :

Nous pourrions très bien créer un formulaire de cette façon :

<form method="post" action="http://www.site.com/envoi.php" target="_blank">

    <input type="text" name="courriel" />
    <input type="text" name="pseudo" />

    <input type="submit" value="post" />

</form>

Je vous laisse faire la comparaison de ce formulaire par rapport au premier qui est situé au début du tutoriel. J'ai en effet rajouté un target="_blank" et en page de destination, j'ai mis le lien relatif d'un site distant.

En gros, l'on peut refaire le formulaire à notre sauce et transférer les données vers un autre site ayant les mêmes valeurs que notre formulaire. Vous me direz oui, mais quel est le problème ?


Alors, imaginons que nous ayons ceci dans notre formulaire, une case à cocher ayant comme valeur (si elle est cochée) : oui.

<input type="checkbox" name="choix" value="oui" />

Nous pourrions très bien (au lieu d'une case à cocher) mettre un champ de texte portant le même nom, mais en changeant la valeur :

<input type="text" name="choix" value="blabla" />

Vous voyez l'astuce ? Maintenant, nous allons voir comment la dévier. Il existe une solution toute simple : Il nous suffit de faire une vérification pour s'assurer que la page internet précédente visitée par l'internaute était bien celle ou se trouvait notre formulaire.

<?php
if($_SERVER["HTTP_REFERER"] !== 'http://www.site.com/index.php") {
    echo "Le formulaire est soumis depuis une source externe !";
}
?>

Mais vous l'aurez compris, il suffit simplement de remplacer www.site.com/index.php par l'adresse internet sur laquelle se trouve votre formulaire. Rien de bien compliqué jusqu'à maintenant !

Vérifier une adresse de courriel

Nous savons maintenant vérifier qu'un champ n'est pas vide et nous savons également comment contrer la soumission d'une source externe. Notre code ci-dessous vérifiera que les données reçues par le formulaire contiennent bien un "@" et un "." d'une adresse de courriel électronique.

Allez, fini le Blabla ! On veut du code, du codeeeee !

<?php
if(!filter_var($_POST["courriel"], FILTER_VALIDATE_EMAIL)) {
    echo "Votre adresse de courriel est incorrecte !";
}
?>

Vous voyez, ce n'est pas si difficile que ça en fin de compte, ça ne prend qu'une simple ligne de code et c'est totalement fonctionnel.

Chaîne à caractères spéciaux

Et maintenant (Pendant qu'on y est) nous allons voir comment vérifier que les données reçues ne contiennent pas de caractères spéciaux ! Là, j'aurais un peu de mal à vous expliquer le code à vrai dire. Non, ce n'est pas chinois, croyez moi !

<?php
if(!preg_match('/^[a-zA-Z0-9-_]+$/', $_POST["pseudo"])) {
    echo "Votre pseudo contient des caractères spéciaux !";
}
?>

Démonstration d'un formulaire (Côté PHP)

<?php
// On vérifie que le formulaire n'a pas été soumis via une source externe
if($_SERVER["HTTP_REFERER"] !== "http://www.site.com/index.php") {
    echo "Le formulaire est soumis depuis une source externe !";
}

// On vérifie que tous les champs ont été complétés
else if(empty($_POST["courriel"]) || empty($_POST["pseudo"])) {
    echo "Vous devez compléter tous les champs du formulaire !";
}

// On vérifie que l'adresse de courriel soit valide
else if(!filter_var($_POST["courriel"], FILTER_VALIDATE_EMAIL)) {
    echo "Votre adresse de courriel est incorrecte !";
}

// On vérifie que le Pseudo ne contient pas de caractères spéciaux
else if(!preg_match('/^[a-zA-Z0-9-_]+$/', $_POST["pseudo"])) {
    echo "Votre pseudo contient des caractères spéciaux !";
}

// Sinon, on indique que tout est parfait
else {
    echo "Félicitations, tout est bon !";
}
?>


  
17 commentaires

Bravo, très utile comme tuto

le 7 octobre 2011

Oui : utile !

le 7 octobre 2011

Très bon tuto

le 7 octobre 2011

Bravo,

Bon tuto, pensez aussi a faire en plus les vérification en js (pour éviter un traitement serveur inutile)

A oui les regExp sont super bien, pour sécurisé et eviter les valeurs space

le 7 octobre 2011

Bravo ! Très bon tuto !

le 8 octobre 2011

Très bon tuto !

@Ancienasgard : la vérification js ne permet pas d'empêcher celle du serveur, elle sert simplement à aider l'utilisateur à remplir correctement un formulaire sans tout le temps charger la page.

Mais la vérification PHP est OBLIGATOIRE

le 8 octobre 2011

@Lucas : Oui voila pourquoi j'ai mis EN PLUS, la js peut être contourné mais souvent elle évite d avoir des traitement inutile a faire

le 9 octobre 2011

est il possible de vérifier qu'une vrais adresse email soit entrer dans un formulaire?car lors d'un concours il est facile de tromper la machine du moment que tu entre une @ et un point?

le 21 octobre 2011

Ben on peut verifier que la structure soit bonne avec une bonne regexp apres pour valide tu peux t en occuper avec l envoie

le 21 octobre 2011

Bonjour,

J'ai créer un formulaire en html nommé "contact.html" et un autre en php nommé "contact.php" a présent je voudrait que sa l'envoi a mon adresse email ... j'ai gmail mais je ne sais pas comment avoir le serveur SMTP intégrer dans GMAIL merci de m'expliquer sa fais 2 semaines que je cherche !

le 30 octobre 2011

Salut ! Pour envoyer des mails avec PHP, tu devrais utiliser la fonction mail()

le 30 octobre 2011

ok je vais essayer Merci d'avance

le 31 octobre 2011

Merci , super pratique

le 9 novembre 2011

cool coe tuto ça aide vraiment!!

le 4 janvier 2012

thank you !!!!!!!!

:s

le 9 janvier 2012

filter_var renverra vrai pour un domaine hors internet (localhost par exemple) lors de la validation de l'e-mail, pas plus qu'il ne vérifie si le domaine est déclaré: test@nowhere ou anonymous@fhfjkhkfjhlhldhjlskdhjkfsdbjnwxlmiopzeincqninicnco.org seront considérés comme valides.

Attention aussi au $_SERVER["HTTP_REFERER"] qui est supprimé par certains antivirus/firewalls/navigateurs et certains proxy de groupe (entreprises, écoles, univeristés, ect...). De plus, le contenu de $_SERVER n'est pas sûr, rien n'empêchera un attaquant d'y placer la bonne valeur, ici c'est la valeur de l'en-tête HTTP Referer qui s'y trouvera.

En utilisant ce test, tous les utilisateurs de ces filtres de protection seront considérés comme "attaquants" alors qu'un véritable attaquant contournera ce test sans difficulté en shell de cette manière :

telnet www.site.com 80
POST /index.php HTTP/1.1
Host: www.site.com
Referer: http://www.site.com/index.php

courriel=test@example&pseudo=Greg
le 9 février 2012

bravo ce super mais Il faut pensé aussi a la securité de champs pour qu'on y depose pas du code breef du n'importe quoi

le 17 février 2015



Ajoute un commentaire !

Ajouter une image... Trouvée sur internet » De mon PC »
Adresse URL :
Adresse de la page de la vidéo :
Taille du texte :
Couleur du texte :

Article lu 25552 fois.