Manuel d'auto-a...login
Manuel d'auto-apprentissage complet PHP
auteur:php.cn  temps de mise à jour:2022-04-15 13:53:54

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.


Validation du formulaire PHP

Note
Note在处理PHP表单时我们需要考虑安全性。

本章节我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。

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.

1021.pngLe formulaire HTML introduit dans ce chapitre contient les champs de saisie suivants : Doit être utilisé avec des champs de texte facultatifs, des boutons radio et des boutons de soumission :

Instance
<!DOCTYPE HTML> 
<html>
<head>
<meta charset="utf-8">
<title>PHP中文网(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;
}
?>

<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>

Exécuter l'instance»

Cliquez sur le bouton « Exécuter l'instance » pour afficher l'instance en ligne

字段验证规则
名字必须。 +只能包含字母和空格
E-mail必须。 + 必须是一个有效的电子邮件地址(包含'@'和'.')
网址必须。如果存在,它必须包含一个有效的URL
备注必须。 多行输入字段(文本域)
性别必须。 必须选择一个

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


Commençons par jetez un oeil au HTML pur Le code du formulaire :

Champs de texte

Les champs "Nom", "E-mail" et "Site Web" sont des éléments de saisie de texte, et le " Le champ "Remarques" est zone de texte. Le code HTML ressemble à ceci :

“名字”: <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 « Genre » est un bouton radio, et le code HTML ressemble à ceci :
Gender :
<input type="radio" name="gender" value="female">女
<input type="radio" name="gender" value="male">男

Éléments du formulaire
Le code du formulaire HTML est le suivant :
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Ce formulaire utilise
method= "post"
Note什么是 $_SERVER["PHP_SELF"] 变量?

$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。
méthode pour soumettre les données. <🎜><🎜>
Note<🎜>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.

Ainsi, $_SERVER["PHP_SELF"] enverra les données du formulaire à la page actuelle au lieu de passer à une autre page.

NoteQu'est-ce que la méthode htmlspecialchars() ?
Note什么是 htmlspecialchars()方法?

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号) 成为 &amp;

  • " (双引号) 成为 &quot;

  • ' (单引号) 成为 &#039;

  • < (小于) 成为 <

  • > (大于) 成为 >


Fonction htmlspecialchars() Convertissez certains caractères prédéfinis en entités HTML.
Les caractères prédéfinis sont :

& (esperluette) devient &

  • " (guillemets doubles) devient "

  • ' (guillemets simples) devient '
    NoteXSS又叫 CSS (Cross-Site Script) ,跨站脚本攻击。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
  • <🎜>< ;<🎜>
  • <🎜>> (supérieur à) devenir><🎜>
  • < 🎜><🎜><🎜>À quoi devons-nous faire attention dans les formulaires PHP ? <🎜><🎜>Les variables $_SERVER["PHP_SELF"] peuvent être utilisées par les pirates <🎜><🎜>Lorsque les pirates utilisent le cross Lorsque le HTTP Le lien du script du site Web est attaqué, la variable serveur $_SERVER["PHP_SELF"] sera également implantée dans le script. La raison est que le script cross-site est ajouté au chemin du fichier exécutable, donc les caractères de $. _SERVER["PHP_SELF"] La chaîne contiendra le code JavaScript derrière le lien HTTP <🎜><🎜>.

    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.

    Cependant, étant donné que l'utilisateur saisira l'adresse suivante dans la barre d'adresse du navigateur :

    http://www.php.cn/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>
    a ajouté une balise de script au code et a ajouté une commande d'alerte. 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 Tout 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 code malveillant peut être protégé dans le fichier de code 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 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 profiter de Variable PHP_SELF, le résultat sera affiché comme suit :
    <form method="post" action="test_form.php/"><script>alert('hacked')</script>">
    n'a pas réussi à essayer cette vulnérabilité !

    Utilisez PHP pour valider les données du formulaire

    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(), lorsque l'utilisateur essaie de soumettre le champ de texte suivant :

    <script>location.href('http://www.php.cn')</script>
    le code ne sera pas exécuté car il sera enregistré en tant qu'échappement HTML Le code est le suivant :
    <script>location.href('http://www.php.cn')</script>
    Le code ci-dessus est sûr et peut être affiché normalement sur la page ou inséré dans les e-mails.

    Lorsque l'utilisateur soumet le formulaire, nous ferons les deux choses suivantes :

    1. 1 Utilisez la fonction PHP trim() pour supprimer le contenu non pertinent dans. les données saisies par l'utilisateur. Caractères nécessaires (tels que les espaces, les tabulations, les nouvelles lignes).

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

    Filtrons-les ensuite La fonction est écrite dans une fonction définie par 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 :

    Instance

    <!DOCTYPE HTML> 
    <html>
    <head>
    <meta charset="utf-8">
    <title>PHP中文网(php.cn)</title>
    </head>
    <body> 
    
    <?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;
    }
    ?>
    
    <h2>PHP 表单验证实例</h2>
    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
       名字: <input type="text" name="name">
       <br><br>
       E-mail: <input type="text" name="email">
       <br><br>
       网址: <input type="text" name="website">
       <br><br>
       备注: <textarea name="comment" rows="5" cols="40"></textarea>
       <br><br>
       性别:
       <input type="radio" name="gender" value="female">女
       <input type="radio" name="gender" value="male">男
       <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>
    .
    Exécuter l'instance»

    Cliquez sur le bouton « Exécuter l'instance » pour afficher l'instance en ligne

    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.

    Tutoriels pratiques recommandés : "Validation du formulaire PHP"

    Dans le chapitre suivant, nous présenterons comment effectuer une vérification sur les données saisies par le l'utilisateur. vérifier.

    Site Web PHP chinois