Validation du formulaire PHP

Validation du formulaire PHP

Dans ce chapitre, nous présenterons comment utiliser PHP pour vérifier les données du formulaire soumises par le client.

Les entrées utilisateur doivent être validées (via le script client) autant que possible. La validation du navigateur est plus rapide et réduit la charge sur le serveur.

Si les entrées de l'utilisateur doivent être insérées dans une base de données, vous devriez envisager d'utiliser la validation du serveur. Un bon moyen de valider un formulaire sur le serveur est de se transmettre le formulaire à lui-même, plutôt que de passer à une autre page. De cette façon, les utilisateurs peuvent recevoir des messages d’erreur sur la même page de formulaire. Il sera plus facile pour les utilisateurs de trouver les erreurs.

Nous devons prendre en compte la sécurité lors du traitement 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.

Exemple de validation de formulaire PHP

QQ图片20161009114426.png

Le formulaire ci-dessus utilise les règles de validation suivantes :

QQ图片20161009114556.png

Nous examinons d'abord le code HTML pur de ce formulaire :

Les champs de texte

le nom, l'e-mail et le site Web sont des éléments de saisie de texte, et le champ de commentaire est une zone de texte. Le code HTML est comme ceci :

Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>



Bouton radio

Le champ genre est un seul bouton Sélectionner, le code HTML est comme ceci :

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

Élément de formulaire

Le code HTML du formulaire est comme ceci :

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

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


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.

Ainsi, $_SERVER["PHP_SELF"] envoie les données du formulaire à la page elle-même au lieu de passer à une autre page. De cette manière, les utilisateurs peuvent obtenir des informations sur les messages d'erreur sur la page du formulaire.


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

htmlspecialchars() convertit les caractères spéciaux en entités HTML. Cela signifie que les caractères HTML tels que < et > Cela empêche les attaquants d'exploiter le code en injectant du code HTML ou JavaScript dans le formulaire (attaques de cross-site scripting).


Rappel important sur la sécurité des formulaires PHP

Les variables $_SERVER["PHP_SELF"] peuvent être exploitées par des hackers !

Si votre page utilise PHP_SELF, les utilisateurs peuvent saisir un trait de soulignement et exécuter des scripts intersites (XSS).

Conseil : les scripts intersites (XSS) sont un type de vulnérabilité de sécurité informatique que l'on trouve couramment dans les applications Web. XSS permet à un attaquant de saisir un script 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 l'utilisateur saisit l'URL normale dans la barre d'adresse : "http://www php.cn. /test_form.php", le code ci-dessus sera converti en :

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

Jusqu'à présent, tout est normal.

Cependant, si l'utilisateur tape l'URL suivante dans la barre d'adresse :

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

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

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

Ce code ajoute un script et une commande d'invite. Et lorsque la page se chargera, le code JavaScript sera exécuté (l'utilisateur verra une info-bulle). Ceci est juste un exemple simple et inoffensif de la façon dont la variable PHP_SELF peut être exploitée.


Vous devez savoir que la balise <script> peut contenir n'importe quel code JavaScript ! Les pirates peuvent rediriger les utilisateurs vers un fichier sur un autre serveur, et le code malveillant contenu dans ce fichier peut modifier les variables globales ou soumettre des formulaires à d'autres adresses pour enregistrer les données utilisateur, etc.


Comment empêcher $_SERVER["PHP_SELF"] d'être exploité ?

L'utilisation de la fonction htmlspecialchars() peut empêcher l'exploitation de $_SERVER["PHP_SELF"].

Le code du formulaire est le suivant :

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

La fonction htmlspecialchars() convertit les caractères spéciaux en entités HTML. Désormais, si l'utilisateur tente d'exploiter la variable PHP_SELF, le résultat suivant sera obtenu :

<form method="post" action="test_form.php/"><script>alert( 'php')< + La première chose est de transmettre toutes les variables via la fonction htmlspecialchars() de PHP

Après avoir utilisé la fonction htmlspecialchars(), si l'utilisateur essaie de soumettre ce qui suit dans le champ de texte. :

< ;script>location.href('http://www.php.cn')</script>


- Le code ne sera pas exécuté car il sera enregistré sous forme de code d'échappement, comme ceci :

<script>location.href('http://www.php.cn')</script>

Maintenant, ce code est affiché sur la page ou dans l'e- le courrier est en sécurité.

Lorsque l'utilisateur soumet le formulaire, nous devons faire deux autres choses :

1. (Grâce à la fonction PHP trim()) Supprimer les caractères inutiles (espaces supplémentaires) dans les données saisies par l'utilisateur. , tabulation, nouvelle ligne)

2. (via la fonction PHP stripslashes()) Supprimez les barres obliques inverses dans les données d'entrée utilisateur ()

Ensuite, nous créons une fonction de vérification (par rapport à l'écriture de code encore et encore le rend plus efficace).

Nous avons nommé la fonction test_input().


Formation continue
||
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> <style> .error {color: #FF0000;} </style> </head> <body> <?php // 定义变量并默认设置为空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "名字是必需的"; } else { $name = test_input($_POST["name"]); // 检测名字是否只包含字母跟空格 if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允许字母和空格"; } } if (empty($_POST["email"])) { $emailErr = "邮箱是必需的"; } else { $email = test_input($_POST["email"]); // 检测邮箱是否合法 if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "非法邮箱格式"; } } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); // 检测 URL 地址是否合法 if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) { $websiteErr = "非法的 URL 的地址"; } } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性别是必需的"; } else { $gender = test_input($_POST["gender"]); } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <h2>PHP 表单验证实例</h2> <p><span class="error">* 必需字段。</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value="<?php echo $name;?>"> <span class="error">* <?php echo $nameErr;?></span> <br><br> E-mail: <input type="text" name="email" value="<?php echo $email;?>"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 网址: <input type="text" name="website" value="<?php echo $website;?>"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea> <br><br> 性别: <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>您输入的内容是:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
soumettreRéinitialiser le code
  • Recommandations de cours
  • Téléchargement du didacticiel