2011-11-26 144 views
0

我有一个表格,最后有几个字段和一个recaptcha代码。在表单验证失败时仅输入一次验证码?

当用户提交表单时,recaptcha字段将与服务器端(PHP)的其他字段一起验证。如果任何字段无效,用户将被重定向到具有错误的相同表单。

但是,问题是:用户必须再次输入recatpcha。

如果表单验证失败,但验证码验证成功,有什么办法可以不要求用户再次输入验证码?

回答

3

当然有。您可以将验证码的验证成功存储到会话(或cookie或数据库)中,如果有指示,则隐藏该验证码。在服务器上,您只需检查是否recaptcha是正确的或指示是有效的。

您还必须确保有效的验证码cookie只能使用一次,因为如果不是垃圾邮件发送者可以简单地一遍又一遍地发送的cookie信息再次和解决的ReCaptcha。

我的想法是存储像“recaptcha_success”一键下的会话中的时间戳,然后检查如果时间戳不超过几分钟以上(任何适合您的需求)。如果不是这样,通过不再验证它来解决这个问题。如果表单是有效的,所以删除下一次用户想用他必须再次输入的ReCaptcha形式的关键。

0

是 - 设置验证码输入成功的会话变量,但不显示回车形式。

2

没有看到你的代码,或者它如何设置完全是我能想到的是使用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> 
+0

在你的PHP,你还必须检查是否captcha_valid被设置成这将是''如果(验证码是有效或$ _SESSION [ 'captcha_valid')== 1)''。此外,一定要检查,如果验证码是他们或captcha_valid设置为一,否则如果没有验证码发送,形式proceeced为有效。 – Sgoettschkes

+0

如果$ _SESSION ['captcha_valid'] == 1,那么表单将不会显示captcha字段,因此在POST变量中不会有“captcha”键值,因此它永远不会达到该点。 – TheOx

+0

因此,如果我手动从请求中删除验证码,PHP代码将假设我之前正确输入了验证码?由于我不是垃圾邮件发送者,我不知道他们是否试图根本不发送任何验证码信息,因此,如果您的实施将会使验证码无效。 – Sgoettschkes

0

你可以通过设置会议无功这样

<?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(); 
} 
?> 

希望这有助于。如果我错过了某些东西,请随时编辑答案。