Я создаю гостевую книгу на 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>";
}






В вашей функции generateCaptchaString() вы сохраняете строку капчи в $_SESSION["captchaString"].
Но в коде проверки POST вы читаете это как: $_SESSION['captcha']
Измените это на $_SESSION["captchaString"].
Кроме того, вы уверены, что URL-адрес для перехода при отправке формы — $_SERVER['PHP_SELF'] (который может быть другим .php-скриптом, который включает или требует этого), а не $_SERVER['REQUEST_URI'], который является тем же URL-адресом, который вы сейчас посещаете.
Кроме того, если код проверки POST находится (или включен) в тот же файл, который также содержит или включает форму, возможно ли, что generateCaptchaString() вызывается снова (для повторного создания формы), таким образом перезаписывая любую предыдущую строку капчи, хранящуюся там?
Да, я также думал, что, может быть, я повторно генерирую капчу, но если бы это было правдой, это скорее должно было бы привести к тому, что я никогда не получу успешную проверку. Проблема сейчас в том, что скрипт даже не использует проверку, я думаю. Если бы это было так, это, скорее всего, все время выдавало бы мне ошибку «Неверная капча», пока я не найду способ не генерировать капчу повторно.