我有一个表格,最后有几个字段和一个recaptcha代码。在表单验证失败时仅输入一次验证码?
当用户提交表单时,recaptcha字段将与服务器端(PHP)的其他字段一起验证。如果任何字段无效,用户将被重定向到具有错误的相同表单。
但是,问题是:用户必须再次输入recatpcha。
如果表单验证失败,但验证码验证成功,有什么办法可以不要求用户再次输入验证码?
我有一个表格,最后有几个字段和一个recaptcha代码。在表单验证失败时仅输入一次验证码?
当用户提交表单时,recaptcha字段将与服务器端(PHP)的其他字段一起验证。如果任何字段无效,用户将被重定向到具有错误的相同表单。
但是,问题是:用户必须再次输入recatpcha。
如果表单验证失败,但验证码验证成功,有什么办法可以不要求用户再次输入验证码?
当然有。您可以将验证码的验证成功存储到会话(或cookie或数据库)中,如果有指示,则隐藏该验证码。在服务器上,您只需检查是否recaptcha是正确的或指示是有效的。
您还必须确保有效的验证码cookie只能使用一次,因为如果不是垃圾邮件发送者可以简单地一遍又一遍地发送的cookie信息再次和解决的ReCaptcha。
我的想法是存储像“recaptcha_success”一键下的会话中的时间戳,然后检查如果时间戳不超过几分钟以上(任何适合您的需求)。如果不是这样,通过不再验证它来解决这个问题。如果表单是有效的,所以删除下一次用户想用他必须再次输入的ReCaptcha形式的关键。
是 - 设置验证码输入成功的会话变量,但不显示回车形式。
没有看到你的代码,或者它如何设置完全是我能想到的是使用PHP会议上最简单的事情:接收
文件形式的数据(假设POST)
session_start();
foreach($_POST as $key=>$val)
{
if($key == "captcha" || $_SESSION['captcha_valid'] != 1)
{
//validate captcha
if(captcha is valid)
{
$_SESSION['captcha_valid'] = 1;
}
}
}
文件包含表格
session_start();
echo "<form method='yourphpfile.php' method='post'>"
if(!isset($_SESSION['captcha_valid']) || $_SESSION['captcha_valid'] != 1)
{
//add captcha code
}
</form>
你可以通过设置会议无功这样
<?php
// captcha is already submitted so no need to verify again,
if(!isset($_SESSION['human_signup']) || (time() - $_SESSION['human_signup'] > 300)){
require_once('admin/recaptcha/recaptchalib.php');
// Get a key from https://www.google.com/recaptcha/admin/create
$publickey = 'your publickey';
$privatekey = 'your privatekey';
# the response from reCAPTCHA
$resp = null;
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
// What happens when the CAPTCHA was entered incorrectly
$errors[] = 'The CAPTCHA wasn\'t entered correctly, please try again';
}else{
$_SESSION['human_signup'] = time();
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
}
验证,然后HTML表单上做这样的事情,以显示验证码形式。
<?php
if (!isset($_SESSION['human_signup']) || (time() - $_SESSION['human_signup'] > 300)){ ?>
<label class="control-label">CAPTCHA</label>
<script type="text/javascript"> var RecaptchaOptions = {theme : 'white' }; </script>
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=your key"></script>
<noscript>
<iframe src="http://www.google.com/recaptcha/api/noscript?k=your key"
height="300" width="500" frameborder="0"></iframe><br>
<textarea name="recaptcha_challenge_field" rows="3" cols="40">
</textarea>
<input type="hidden" name="recaptcha_response_field"
value="manual_challenge">
</noscript>
<? } ?>
确保您在用户注册完成后删除会话。喜欢这个。
<?php
//insert registration data in db i.e. registration is complete.
//unset the session used to hide the captcha.
unset($_SESSION['human_signup']);
?>
少了一个重要的特征以手动,然后阻止用户输入验证码使用一些脚本自动创建帐户。
/* if user tries to register automatically by manually entering captcha and using scrpt to create accoutns */
<?php
if(isset($_SESSION['human_signup']) && ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT'])) {
unset($_SESSION['human_signup']);
unset($_SESSION['user_agent']);
@session_destroy();
@session_unset();
}
?>
希望这有助于。如果我错过了某些东西,请随时编辑答案。
在你的PHP,你还必须检查是否captcha_valid被设置成这将是''如果(验证码是有效或$ _SESSION [ 'captcha_valid')== 1)''。此外,一定要检查,如果验证码是他们或captcha_valid设置为一,否则如果没有验证码发送,形式proceeced为有效。 – Sgoettschkes
如果$ _SESSION ['captcha_valid'] == 1,那么表单将不会显示captcha字段,因此在POST变量中不会有“captcha”键值,因此它永远不会达到该点。 – TheOx
因此,如果我手动从请求中删除验证码,PHP代码将假设我之前正确输入了验证码?由于我不是垃圾邮件发送者,我不知道他们是否试图根本不发送任何验证码信息,因此,如果您的实施将会使验证码无效。 – Sgoettschkes