validation du formulaire
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.
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 présenté dans ce chapitre contient les champs de saisie suivants : Doit être accompagné de champs de texte facultatifs, de boutons radio et de boutons de soumission :
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>php.cn</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; } ?>
Regardons d'abord le code pur du formulaire HTML :
Champ de texte
"名字", "E-mail", 及"网址"字段为文本输入元素,"备注"字段是 textarea。HTML代码如下所示: “名字”: <input type="text" name="name"> E-mail: <input type="text" name="email"> 网址: <input type="text" name="website"> 备注: <textarea name="comment" rows="5" cols="40"></textarea>
Bouton radio
Le champ "Gender" est le bouton radio, code HTML Comme indiqué ci-dessous :
Sexe :
<input type="radio" name="gender" value="female">Femme
<input type= "radio" nom ="gender" value="male">Mâle
Élément de formulaire
Le code du formulaire HTML est le suivant Affichage :
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Ce formulaire utilise method=" post" pour soumettre des données.
Qu'est-ce que la variable $_SERVER["PHP_SELF"] ?
$_SERVER["PHP_SELF"] est une variable super globale qui renvoie la valeur de le script en cours d'exécution, nom du fichier, lié à la racine du document.
Ainsi, $_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.
· & (Il) devient & amp;
· · "(guillemets doubles) pour devenir & quot;
· ' (Citation simple) devient'· Devenir À quoi faut-il prêter attention ?
Les variables $_SERVER["PHP_SELF"] peuvent être utilisées par les 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 le script intersite est ajouté au chemin du fichier exécutable. donc la chaîne de $_SERVER["PHP_SELF"] contiendra le JavaScript derrière le code du programme HTTPXSS, également connu sous le nom de CSS (Cross-Site Script). , est une attaque de script intersite dans laquelle des attaquants malveillants insèrent du code HTML malveillant dans une page Web. Lorsque la page est paginée, le code HTML intégré dans le Web sera exécuté pour atteindre l'objectif particulier des utilisateurs malveillants
.
Spécifiez le nom du fichier de formulaire suivant comme "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" ", le code ci-dessus est modifié comme suit :
<form method="post" action="test_form.php">
C'est très bien.
Considérez cependant que l'utilisateur saisira l'adresse suivante dans la barre d'adresse du navigateur :
//m.sbmmt.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>alert('hacked')</script>
La balise script est ajoutée au code et la commande alert est 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 la page d'un autre serveur. Le fichier de code de la page peut protéger le code malveillant et le code peut modifier les variables globales ou obtenir les données du formulaire de l'utilisateur.
Comment éviter que $_SERVER["PHP_SELF"] soit exploité ?
$_SERVER["PHP_SELF"] peut être évité en utilisant les htmlspecialchars( ) fonction .
le code du formulaire est le suivant :
<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 exploiter 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 cette vulnérabilité a échoué !
Utilisez PHP pour valider les données du formulaire
Tout d'abord, nous traitons toutes les données soumises par l'utilisateur via la fonction htmlspecialchars() de PHP.
Lorsque nous utilisons la fonction htmlspecialchars(), l'utilisateur essaie de soumettre le champ de texte suivant :
<script>location.href('//m.sbmmt.com' )< ;/script>
Ce code ne sera pas exécuté car il sera enregistré en tant que code HTML à échappement, comme indiqué ci-dessous :
<script>location.href('http: / /m.sbmmt.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 :
1. Utilisez la fonction PHP trim() pour supprimer les caractères inutiles (tels que les espaces, les tabulations) dans l'utilisateur. données d'entrée, nouvelle ligne).
2. Utilisez la fonction PHP stripslashes() pour supprimer les barres obliques inverses dans les 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 détecter toutes les variables dans $_POST grâce à la fonction test_input(). Le code du script est le suivant :
Exemple
<?php // 定义变量并默认设置为空值 $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; } ?>
Notez que nous exécutons le. script ci-dessus Quand, $_SERVER["REQUEST_METHOD"] sera utilisé 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.
1. 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.
2. Utilisez la fonction PHP stripslashes() pour supprimer les barres obliques inverses() dans les données d'entrée utilisateur()
3. Utilisez la fonction test_input() pour détecter toutes les variables dans $_POST