PHP-код не проверяет Captcha перед публикацией

Я создаю гостевую книгу на PHP, каждый IP-адрес может публиковаться только один раз.

Кроме того, перед отправкой потребуется имя и сообщение, а также проверка CAPTCH. Каким-то образом мой код игнорирует проверку Captcha, пока что-то написано на входе, независимо от того, что.

Я попытался сохранить капчу в сеансе и проверить ввод для капчи, но это не помогает.

Код для генерации капчи:

function generateCaptchaString($length = 5) {
$captchaString = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
   $_SESSION["captchaString"] = $captchaString;
     return $captchaString;
}

Код для ввода имени, сообщения и капчи:

<form action = "<?php echo $_SERVER['PHP_SELF']; ?>" method = "POST" 
id = "guestform">
            <fieldset>
                <legend>Skriv i gästboken</legend>
                <label>Från: </label>
                <input type = "text" placeholder = "Skriv ditt namn" 
name = "name">
                <br>
                <label for = "text">Inlägg</label>
                <textarea id = "text" name = "message"
                          rows = "10" cols = "50"
                          placeholder = "Skriva meddelande här"></textarea>
                <br>

                <label>Captcha: <span class = "red" id = "captchastring"><?php 
echo  generateCaptchaString(); ?></span></label>
                <input type = "text" placeholder = "Skriva captcha här" 
name = "captcha" id = "captchainput" required>
                <button type = "submit" id = "submit">Skicka</button>
            </fieldset>
        </form>

Код в POST-функции, которая будет проверять на валидацию.

if ( ! isset($_POST['captcha']) || empty($_POST['captcha']) || 
$_POST['captcha'] != $_SESSION['captcha']) {
    $error .= "<p class=\"message-error\">" . $messages['math_invalid'] . " 
</p>";
 }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
28
1

Ответы 1

В вашей функции generateCaptchaString() вы сохраняете строку капчи в $_SESSION["captchaString"].

Но в коде проверки POST вы читаете это как: $_SESSION['captcha']

Измените это на $_SESSION["captchaString"].

Кроме того, вы уверены, что URL-адрес для перехода при отправке формы — $_SERVER['PHP_SELF'] (который может быть другим .php-скриптом, который включает или требует этого), а не $_SERVER['REQUEST_URI'], который является тем же URL-адресом, который вы сейчас посещаете.

Кроме того, если код проверки POST находится (или включен) в тот же файл, который также содержит или включает форму, возможно ли, что generateCaptchaString() вызывается снова (для повторного создания формы), таким образом перезаписывая любую предыдущую строку капчи, хранящуюся там?

Да, я также думал, что, может быть, я повторно генерирую капчу, но если бы это было правдой, это скорее должно было бы привести к тому, что я никогда не получу успешную проверку. Проблема сейчас в том, что скрипт даже не использует проверку, я думаю. Если бы это было так, это, скорее всего, все время выдавало бы мне ошибку «Неверная капча», пока я не найду способ не генерировать капчу повторно.

GuruGuruGuru 06.02.2019 01:25

Другие вопросы по теме