PHP代码不会在发布前验证验证码

时间:2019-02-05 23:57:18

标签: 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>";
 }

1 个答案:

答案 0 :(得分:0)

generateCaptchaString()函数中,将验证码字符串存储在$_SESSION["captchaString"]中。

但是在POST验证代码中,您将其读取为:$_SESSION['captcha']

也将其更改为$_SESSION["captchaString"]

此外,您确定提交表单时要使用的URL是$_SERVER['PHP_SELF'](可能是包含或需要此URL的另一个.php脚本),而不是同一URL的$_SERVER['REQUEST_URI']您正在访问。

此外,如果POST校验码位于(或包含在)同样包含或包含表单的文件中,是否有可能再次调用generateCaptchaString()(以再次创建表单),从而覆盖任何以前的captchaString存储在哪里?