Dans ce chapitre, nous présenterons comment utiliser PHP pour vérifier les données du formulaire soumises par le client.
Nous devons prendre en compte la sécurité lorsque nous traitons des formulaires PHP. Dans ce chapitre, nous démontrerons le traitement sécurisé des données du formulaire PHP. Afin de prévenir les pirates informatiques et le spam, nous devons effectuer une vérification de la sécurité des données sur le formulaire. |
Le formulaire HTML décrit dans ce chapitre contient les champs de saisie suivants : Champs de texte obligatoires et facultatifs, boutons radio et boutons de soumission :
Les règles de validation du formulaire ci-dessus sont les suivantes :
Champ | Règles de validation |
---|---|
nom | doit. +ne peut contenir que des lettres et des espaces |
doit. + doit être une adresse e-mail valide (contient '@' et '.') | |
URL | Facultatif. S'il est présent, il doit contenir une URL valide |
Remarque | Facultatif. Champs de saisie multilignes (champs de texte) |
genre | doit. Il faut en choisir un |
Jetons d'abord un coup d'œil au code pur du formulaire HTML :
Les champs « Nom », « E-mail » et « Site Web » sont des éléments de saisie de texte et le champ « Remarques » 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">Remarques : <textarea name="comment" rows="5" cols="40"></textarea>
Le champ « Genre » est un bouton radio et le code HTML ressemble à ceci :
Sexe :<input type="radio" name="gender" value="female">Femme<input type="radio" name="gender" value="male">Homme
Le code du formulaire HTML ressemble à ceci :
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Le formulaire utilise la méthode method="post" pour soumettre les données.
Qu'est-ce que la variable $_SERVER["PHP_SELF"] ? $_SERVER["PHP_SELF"] est une variable super globale qui renvoie le nom de fichier du script en cours d'exécution et est liée à la racine du document. |
Par conséquent, $_SERVER["PHP_SELF"] enverra les données du formulaire à la page actuelle au lieu de passer à une autre page.
Qu'est-ce que la méthode htmlspecialchars() ? La fonction htmlspecialchars() convertit certains caractères prédéfinis en entités HTML. Les caractères prédéfinis sont : & (esperluette) devient & " (guillemet double) devient " ' (guillemet simple) devient ' < (inférieur à) devient < > (supérieur à) devenir> |
La variable $_SERVER["PHP_SELF"] peut être utilisée par des pirates !
Lorsque les pirates utilisent des liens HTTP de script intersite pour attaquer, la variable serveur $_SERVER["PHP_SELF"] sera également intégrée dans le script. La raison en est que les scripts intersites sont ajoutés au chemin du fichier exécutable, donc la chaîne $_SERVER["PHP_SELF"] contiendra le code du programme JavaScript derrière le lien HTTP.
XSS est également appelé CSS (Cross-Site Script), une attaque de script intersite. Des attaquants malveillants insèrent du code HTML malveillant dans une page Web Lorsqu'un utilisateur parcourt la page, le code HTML intégré dans la page Web sera exécuté, atteignant ainsi l'objectif particulier de l'utilisateur malveillant. |
Spécifiez le nom de fichier de formulaire suivant "test_form.php" :
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Maintenant, nous utilisons l'URL pour spécifier l'adresse de soumission "test_form.php", et le code ci-dessus est modifié comme suit :
<form method="post" action="test_form.php">
Ce serait bien.
Cependant, considérez que l'utilisateur saisira l'adresse suivante dans la barre d'adresse du navigateur :
http://www.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
L'URL ci-dessus sera analysée dans le code suivant et exécutée :
<form method="post" action="test_form.php/"><script>alerte('piraté')</script>
Une balise de script a été ajoutée au code et une commande d'alerte a été ajoutée. Ce code Javascript sera exécuté au chargement de la page (l'utilisateur verra une boîte pop-up). Ceci n'est qu'un exemple simple de la façon dont la variable PHP_SELF peut être exploitée par des pirates.
Veuillez noter que n'importe quel code JavaScript peut être ajouté dans la balise <script> ! Les pirates peuvent l'utiliser pour rediriger la page vers une page sur un autre serveur. Le fichier de code de la page peut protéger le code malveillant. Le code peut modifier les variables globales ou obtenir les données du formulaire de l'utilisateur.
$_SERVER["PHP_SELF"] peut être évité en utilisant la fonction htmlspecialchars().
Le code du formulaire ressemble à ceci :
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() convertit certains caractères prédéfinis en entités HTML. Désormais, si l'utilisateur souhaite utiliser la variable PHP_SELF, le résultat sera affiché comme suit :
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
La tentative d'exploitation de cet exploit a échoué !
Tout d’abord, nous traitons toutes les données soumises par les utilisateurs via la fonction htmlspecialchars() de PHP.
Lorsque nous utilisons la fonction htmlspecialchars(), l'utilisateur tente de soumettre le champ de texte suivant :
<script>location.href('http://www.codercto.com')</script>
Ce code ne sera pas exécuté car il sera enregistré sous forme de code HTML échappé comme ceci :
<script>location.href('http://www.codercto.com')</script>
Le code ci-dessus est sûr et peut être affiché normalement sur la page ou inséré dans des e-mails.
Lorsque l'utilisateur soumet le formulaire, nous ferons les deux choses suivantes :
Utilisez la fonction PHP trim() pour supprimer les caractères inutiles (tels que les espaces, les tabulations, les nouvelles lignes) dans les données saisies par l'utilisateur.
Utilisez la fonction PHP stripslashes() pour supprimer les barres obliques inverses () des données d'entrée utilisateur
Ensuite, écrivons ces fonctions de filtrage dans une fonction que nous définissons nous-mêmes, ce qui peut grandement améliorer la réutilisabilité du code.
Nommez la fonction test_input().
Maintenant, nous pouvons utiliser la fonction test_input() pour détecter toutes les variables dans $_POST. Le code du script est le suivant :
<?php//Définissez les variables et définissez-les sur des valeurs vides par défaut $name= $email= $gender= $comment= $website= "" if($_SERVER["REQUEST_METHOD"]== "POST") { $name= test_input($_POST["nom"]); $email= test_input($_POST["email"]); test_input($_POST["site Web"]); $comment= test_input($_POST["comment"]); $gender= test_input($_POST["gender"]);} functiontest_input($data){ $data= trim ($data); $data= stripslashes($data); $data= htmlspecialchars($data);}?>
Notez que lorsque nous exécuterons le script ci-dessus, nous utiliserons $_SERVER["REQUEST_METHOD"] pour détecter si le formulaire a été soumis. Si REQUEST_METHOD est POST, le formulaire sera soumis - et les données seront validées. Si le formulaire n’est pas soumis, la validation sera ignorée et affichée vide.
L'utilisation d'éléments de saisie dans les exemples ci-dessus est facultative et peut être affichée normalement même si l'utilisateur ne saisit aucune donnée.
Dans le chapitre suivant, nous présenterons comment valider les données saisies par l'utilisateur.