我正在用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>";
}
答案 0 :(得分:0)
在generateCaptchaString()
函数中,将验证码字符串存储在$_SESSION["captchaString"]
中。
但是在POST验证代码中,您将其读取为:$_SESSION['captcha']
也将其更改为$_SESSION["captchaString"]
。
此外,您确定提交表单时要使用的URL是$_SERVER['PHP_SELF']
(可能是包含或需要此URL的另一个.php脚本),而不是同一URL的$_SERVER['REQUEST_URI']
您正在访问。
此外,如果POST校验码位于(或包含在)同样包含或包含表单的文件中,是否有可能再次调用generateCaptchaString()
(以再次创建表单),从而覆盖任何以前的captchaString存储在哪里?