繁体   English   中英

php如何验证输入的验证码是否有效?

[英]How do I check if entered captcha code is valid in php?

我有一张带有验证码的注册表我想知道如何检查输入的验证码是否有效。

如果有效则完成注册过程如果不显示错误信息。

我做了一个例子,但我得到了如下图所示的错误:

我得到的错误

注册.php

<?php

require_once "db.php";
session_start();

if (isset($_SESSION["user_id"])) {
    header("location: acceuil.php");
}

$error = false;

if (isset($_POST["register_user"])) {
    $name = mysqli_real_escape_string($con, $_POST["name"]);
    $email = mysqli_real_escape_string($con, $_POST["email"]);
    $password = mysqli_real_escape_string($con, $_POST["password"]);
    $confirm_password = mysqli_real_escape_string($con, $_POST["confirm_password"]);

    if (!preg_match("/^[a-zA-Z ]+$/", $name)) {
        $error = true;
        $uname_error = "Le nom ne doit contenir que des alphabets et des espaces !";
    }

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error = true;
        $email_error = "Veuillez saisir une adresse e-mail valide !";
    }

    if (strlen($password) < 6) {
        $error = true;
        $password_error = "Le mot de passe doit comporter au moins 6 caractères !";
    }

    if ($password != $confirm_password) {
        $error = true;
        $cpassword_error = "Le mot de passe et la confirmation du mot de passe ne correspondent pas !";
    }
    
if(sha1($_POST['verif_code']) == $_SESSION['verif_code']) { 
    $captcha = $_POST['verif_code'];
} else { 
    $error = true;
    $error_message = "The captcha code you entered does not match. Please try again.";
}

    // Check the database to make sure
    // a user does not already exist with the same name and/or email
    $query = "SELECT * FROM users WHERE name='$name' OR email='$email' LIMIT 1";
    $result = mysqli_query($con, $query);
    $user = mysqli_fetch_assoc($result);

    if ($user) {
        if ($user["name"] === $name) {
            $error_message = "Ce nom est déjà utilisé !";
        }

        if ($user["email"] === $email) {
            $error_message = "Cet e-mail est déjà utilisé !";
        }
    } else {
        // Finally, register user if there are no errors in the form
        if (mysqli_query($con, "INSERT INTO users(name, email, password) VALUES('" . $name . "', '" . $email . "', '" . md5($password) . "')")) {
            $success_message = "Votre compte a été créé avec succès.";
            // header("Refresh:2 ; URL=auth.php");
        } else {
            $error_message = "Oups! quelque chose ne va pas lors de l'inscription! Veuillez réessayer plus tard!";
        }
    }
}

?>

<!DOCTYPE html>
<!--[if lt IE 7]><html class="ie ie6" lang="en"> <![endif]-->
<!--[if IE 7]><html class="ie ie7" lang="en"> <![endif]-->
<!--[if IE 8]><html class="ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!-->
<html lang="en">
    <!--<![endif]-->
    <head>
        <!-- Required meta tags -->
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="description" content="Project Description" />
        <meta name="author" content="Project Author" />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
        <title>Inscription</title>
        <!-- CSS Libraries -->
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" />
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" />
        <!-- Google Fonts -->
        <link rel="preconnect" href="https://fonts.googleapis.com" />
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
        <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" />
        <style>
            body {
                font-family: "Poppins", sans-serif;
            }
        </style>
    </head>
    <body class="bg-light">
        <div class="container col-md-6 mt-5">
            
<?php
if (isset($success_message)) {
    echo "<div class='alert alert-success'><i class='fas fa-check-circle me-1'></i> " . $success_message . "</div>";
}

if (isset($error_message)) {
    echo "<div class='alert alert-danger'><i class='fas fa-exclamation-triangle me-1'></i> " . $error_message . "</div>";
}
?>
            
            <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" autocomplete="off">
                <fieldset>
                    <legend class="h2 mb-4">Connectez-vous et profitez de nos meilleur produits</legend>
                    <div class="row mb-3">
                        <label for="name" class="col-sm-4 col-form-label"><i class="fas fa-user-circle me-1"></i> Name <sup class="fw-bold text-danger">*</sup></label>
                        <div class="col-sm-8">
                            <input type="text" id="name" class="form-control" name="name" value="<?php if($error) echo $name; ?>" autofocus required />
                            <?php if (isset($uname_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $uname_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class="row mb-3">
                        <label for="email" class="col-sm-4 col-form-label"><i class="fas fa-at me-1"></i> E-mail <sup class="fw-bold text-danger">*</sup></label>
                        <div class="col-sm-8">
                            <input type="email" id="email" class="form-control" name="email" value="<?php if($error) echo $email; ?>" required />
                            <?php if (isset($email_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $email_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class="row mb-3">
                        <label for="password" class="col-sm-4 col-form-label"><i class="fas fa-key me-1"></i> Mot de passe <sup class="fw-bold text-danger">*</sup></label>
                        <div class="col-sm-8">
                            <input type="password" id="password" class="form-control" name="password" value="" required />
                            <?php if (isset($password_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $password_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class="row mb-3">
                        <label for="confirm_password" class="col-sm-4 col-form-label"><i class="fas fa-key me-1"></i> Retapez votre MdP <sup class="fw-bold text-danger">*</sup></label>
                        <div class="col-sm-8">
                            <input type="password" id="confirm_password" class="form-control" name="confirm_password" value="" required />
                            <?php if (isset($cpassword_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $cpassword_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class="row mb-3">
                        <img src="captcha/verif_code_gen.php" class="col-sm-4 col-form-label" alt="code de vérification" />
                        <div class="col-sm-8">
                            <input type="text" class="form-control" name="verif_code" value="" required />
                            <?php if (isset($captcha_error)) echo "<div class='text-danger mt-3'><i class='fas fa-exclamation-triangle me-1'></i> ". $captcha_error ."</div>"; ?>
                        </div>
                    </div>
                    <div class="text-end">
                        <button type="submit" class="btn btn-primary" name="register_user">S'inscrire<i class="fas fa-arrow-alt-circle-right ms-1"></i></button>
                    </div>
                </fieldset>
            </form>
            <p>
                Already a member? <a href="auth.php">Sign in</a>
            </p>
        </div>
        <!-- JS Libraries -->
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"></script>
    </body>
</html>

验证码/verif_code_gen.php

<?php
session_start();
header("Content-type: image/png");
$_img = imagecreatefrompng("fond_verif_img.png");
$avant_plan = imagecolorallocate($_img, 255, 255, 255);
$nombre = mt_rand(100000, 999999);
$_SESSION["alert_nbr"] = $nombre;
imagestring($_img, 5, 18, 8, $nombre, $avant_plan);
imagepng($_img);
?>

验证码.php

<?php
   session_start();
   $code=rand(1000,9999);
   $_SESSION["code"]=$code;
   $image = imagecreatetruecolor(50, 24);
   $background = imagecolorallocate($image, 245, 73, 73); 
   $forground = imagecolorallocate($image, 255, 255, 255);
   imagefill($image, 0, 0, $background);
   imagestring($image, 5, 5, 5,  $code, $forground);
  header("Cache-Control: no-cache, must-revalidate");
  header('Content-type: image/png');
  imagepng($image);
  imagedestroy($image);
?>

我该如何解决这个问题?

许多事情,许多东西。

您在每个脚本中使用了不同的变量名称。

  • 在 register.php 中,您将 POST 变量与 $_SESSION['verif_code'] 进行比较
  • 在 captcha/verif_code_gen.php 你称之为 $_SESSION["alert_nbr"]
  • 在 captcha.php 你称之为 $_SESSION["code"]

其次,你为什么要创建一个随机数两次? 让我们做一些清理和简化:

寄存器 php中:

在 error = false 之后插入这个

$error = false;

$_SESSION["captcha_code"] = mt_rand(100000, 999999);

将以下行更改为:

if ( $_POST[ 'verif_code' ] ) != $_SESSION[ 'captcha_code' ] ) {
    $error = true;
    $error_message = "The captcha code you entered does not match. Please try again.";
} else {
    // Check the database to make sure
    // a user does not already exist with the same name and/or email
    $query = "SELECT * FROM users WHERE name='$name' OR email='$email' LIMIT 1";
    $result = mysqli_query( $con, $query );
    $user = mysqli_fetch_assoc( $result );

    if ( $user ) {
        if ( $user[ "name" ] === $name ) {
            $error_message = "Ce nom est déjà utilisé !";
        }

        if ( $user[ "email" ] === $email ) {
            $error_message = "Cet e-mail est déjà utilisé !";
        }
    } else {
        // Finally, register user if there are no errors in the form
        if ( mysqli_query( $con, "INSERT INTO users(name, email, password) VALUES('" . $name . "', '" . $email . "', '" . md5( $password ) . "')" ) ) {
            $success_message = "Votre compte a été créé avec succès.";
            // header("Refresh:2 ; URL=auth.php");
        } else {
            $error_message = "Oups! quelque chose ne va pas lors de l'inscription! Veuillez réessayer plus tard!";
        }
    }
}

那么captcha/verif_code_gen.php应该是:

session_start();
header("Content-type: image/png");
$_img = imagecreatefrompng("fond_verif_img.png");
$avant_plan = imagecolorallocate($_img, 255, 255, 255);
$nombre = $_SESSION["captcha_code"];
imagestring($_img, 5, 18, 8, $nombre, $avant_plan);
imagepng($_img);

现在你不需要captcha.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM