Ввод recaptcha только один раз при проверке формы не удалось? - PullRequest
0 голосов
/ 26 ноября 2011

У меня есть форма с несколькими полями и кодом рекапчи в конце.

Когда пользователь отправляет форму, поле рекапчи проверяется вместе с другими полями на стороне сервера (PHP).Если какое-либо из полей недопустимо, пользователь перенаправляется на ту же форму с ошибками.

Однако проблема заключается в следующем: пользователь должен снова ввести recatpcha.

Есть ли способ, которым я НЕ могу попросить пользователя ввести повторную проверку заново, если проверка формы не удалась, но проверка капчи прошла успешно?

Ответы [ 4 ]

3 голосов
/ 26 ноября 2011

Конечно, есть. Вы можете сохранить успех проверки recaptcha в сеансе (или cookie, или в базе данных), а затем скрыть recaptcha, если указание есть. На стороне сервера вы просто должны проверить, правильна ли recaptcha или действительна индикация.

Вы также должны убедиться, что действительный cookie-файл recaptcha можно использовать только один раз, потому что в противном случае спамер может просто отправлять информацию о cookie-файле снова и снова и обходить recaptcha.

Моя идея заключается в том, чтобы сохранить временную метку в сеансе под ключом, подобным «recaptcha_success», а затем проверить, не является ли временная метка старше нескольких минут (что соответствует вашим потребностям). Если это не так, обходите recaptcha, не проверяя его снова. Если форма действительна, удалите ключ, поэтому в следующий раз, когда пользователь захочет использовать форму, он должен снова ввести рекапчу.

2 голосов
/ 26 ноября 2011

Не видя ваш код или его настройку, самое простое, что я могу придумать, - это использовать сеанс 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 голосов
/ 28 марта 2015

вы можете проверить, установив сессию var, как это

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

надеюсь, это поможет. Если я что-то пропустил, пожалуйста, не стесняйтесь редактировать ответ.

0 голосов
/ 26 ноября 2011

Да - установить переменную сеанса, чтобы капча была введена успешно, и не отображать форму рекапчи.

...