PHP Validation de Formulaire


Validation de Formulaire PHP

Pensez SÉCURITÉ lors du traitement des formulaires PHP !

Ces pages montreront comment traiter les formulaires PHP en tenant compte de la sécurité. Une validation appropriée des données du formulaire est essentielle pour protéger votre formulaire contre les hackers et les spammeurs !

Le formulaire HTML sur lequel nous allons travailler dans ces chapitres contient divers champs de saisie : des champs de texte obligatoires et optionnels, des boutons radio et un bouton de soumission :

Les règles de validation pour le formulaire ci-dessus sont les suivantes :

Champ Règles de Validation
Nom Obligatoire. + Ne doit contenir que des lettres et des espaces
E-mail Obligatoire. + Doit contenir une adresse e-mail valide (avec @ et .)
Site Web Optionnel. S'il est présent, il doit contenir une URL valide
Commentaire Optionnel. Champ de saisie multi-lignes (textarea)
Genre Obligatoire. Doit en sélectionner un

D'abord, nous allons examiner le code HTML brut pour le formulaire :



Champs de Texte

Les champs de nom, d'email et de site web sont des éléments de saisie de texte, et le champ de commentaire est une zone de texte.

Le code HTML ressemble à ceci :

Nom : <input type="text" name="name"> E-mail : <input type="text" name="email"> Site Web : <input type="text" name="website"> Commentaire : <textarea name="comment" rows="5" cols="40"></textarea> 

Boutons Radio

Les champs de genre sont des boutons radio et le code HTML ressemble à ceci :

Genre : <input type="radio" name="gender" value="female">Femme <input type="radio" name="gender" value="male">Homme <input type="radio" name="gender" value="other">Autre 

L'Élément de Formulaire

Le code HTML du formulaire ressemble à ceci :

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 

Lorsque le formulaire est soumis, les données du formulaire sont envoyées avec method="post".

Qu'est-ce que la variable $_SERVER["PHP_SELF"] ?

La $_SERVER["PHP_SELF"] est une super variable globale qui renvoie le nom de fichier du script actuellement en cours d'exécution.

Ainsi, la $_SERVER["PHP_SELF"] envoie les données du formulaire soumis à la même page, au lieu de rediriger vers une autre page. De cette façon, l'utilisateur recevra des messages d'erreur sur la même page que le formulaire.

Qu'est-ce que la fonction htmlspecialchars() ?

La htmlspecialchars() fonction convertit les caractères spéciaux en entités HTML. Cela signifie qu'elle remplacera les caractères HTML comme < et > par &lt; et &gt; . Cela empêche les attaquants d'exploiter le code en injectant du code HTML ou Javascript (attaques de type Cross-site Scripting) dans les formulaires.


Avertissement !

La variable $_SERVER["PHP_SELF"] peut être utilisée par des hackers !

Si PHP_SELF est utilisé dans votre page, alors un utilisateur peut entrer un slash / et ensuite quelques commandes de Cross Site Scripting (XSS) à exécuter.

Le Cross-site scripting (XSS) est un type de vulnérabilité de sécurité informatique que l'on trouve généralement dans les applications Web. Le XSS permet aux attaquants d'injecter des scripts côté client dans des pages Web consultées par d'autres utilisateurs.

Supposons que nous ayons le formulaire suivant dans une page nommée "test_form.php" :

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>"> 

Maintenant, si un utilisateur entre l'URL normale dans la barre d'adresse comme "http://www.example.com/test_form.php", le code ci-dessus sera traduit en :

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

Jusqu'ici, tout va bien.

Cependant, considérons qu'un utilisateur entre l'URL suivante dans la barre d'adresse :

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

Dans ce cas, le code ci-dessus sera traduit en :

<form method="post" action="test_form.php/"><script>alert('hacked')</script> 

Ce code ajoute une balise script et une commande d'alerte. Et lorsque la page se charge, le code JavaScript sera exécuté (l'utilisateur verra une boîte d'alerte). C'est juste un exemple simple et inoffensif de la façon dont la variable PHP_SELF peut être exploitée.

Soyez conscient que tout code JavaScript peut être ajouté à l'intérieur de la balise <script> ! Un hacker peut rediriger l'utilisateur vers un fichier sur un autre serveur, et ce fichier peut contenir du code malveillant qui peut altérer les variables globales ou soumettre le formulaire à une autre adresse pour sauvegarder les données de l'utilisateur, par exemple.


Comment Éviter les Exploits de $_SERVER["PHP_SELF"] ?

Les exploits de $_SERVER["PHP_SELF"] peuvent être évités en utilisant la fonction htmlspecialchars() .

Le code du formulaire devrait ressembler à ceci :

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 

La fonction htmlspecialchars() convertit les caractères spéciaux en entités HTML. Maintenant, si l'utilisateur essaie d'exploiter la variable PHP_SELF, cela donnera le résultat suivant :

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;"> 

La tentative d'exploitation échoue, et aucun dommage n'est causé !


Valider les Données du Formulaire Avec PHP

La première chose que nous allons faire est de passer toutes les variables par la fonction htmlspecialchars() de PHP.

Lorsque nous utilisons la fonction htmlspecialchars() , si un utilisateur essaie de soumettre ce qui suit dans un champ de texte :

<script>location.href('http://www.hacked.com')</script>

cela ne sera pas exécuté, car cela sera enregistré comme code HTML échappé, comme ceci :

&lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt; 

Le code est maintenant sûr à afficher sur une page ou à l'intérieur d'un e-mail.

Nous allons également faire deux autres choses lorsque l'utilisateur soumet le formulaire :

  1. Supprimer les caractères inutiles (espace supplémentaire, tabulation, nouvelle ligne) des données saisies par l'utilisateur (avec la fonction PHP trim() )
  2. Supprimer les barres obliques \ des données saisies par l'utilisateur (avec la fonction PHP stripslashes() )

L'étape suivante consiste à créer une fonction qui effectuera toutes les vérifications pour nous (ce qui est beaucoup plus pratique que d'écrire le même code encore et encore).

Nous allons nommer la fonction test_input() .

Maintenant, nous pouvons vérifier chaque variable $_POST avec la fonction test_input() , et le script ressemble à ceci :

Exemple

// définir des variables et les initialiser à des valeurs vides $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = test_input($_POST["name"]); $email = test_input($_POST["email"]); $website = test_input($_POST["website"]); $comment = test_input($_POST["comment"]); $gender = test_input($_POST["gender"]); } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } 
Exécuter l'Exemple »

Remarquez qu'au début du script, nous vérifions si le formulaire a été soumis en utilisant $_SERVER["REQUEST_METHOD"] . Si le REQUEST_METHOD est POST , alors le formulaire a été soumis - et il doit être validé. S'il n'a pas été soumis, nous sautons la validation et affichons un formulaire vierge.

Cependant, dans l'exemple ci-dessus, tous les champs de saisie sont optionnels. Le script fonctionne bien même si l'utilisateur n'entre aucune donnée.

L'étape suivante consiste à rendre les champs de saisie obligatoires et à créer des messages d'erreur si nécessaire.