N
N
Noatitauaaggi2022-04-13 14:03:48
PHP
Noatitauaaggi, 2022-04-13 14:03:48

How to make recaptcha in the form required if it is v2 and v3?

Welcome all! I hope someone can help, and if you need "for beer", I don't feel sorry, because I don't want to live after a week of butting with this thing. I took https://habr.com/ru/post/582984/
from this topic and remade it to fit my form, but the application is sent without passing the captcha. There were similar questions here, but there it was about working with only one of the captcha versions, and I have two of them. The feedback form code (taken from the topic above) and added only the user agreement and edited the form line.

<form action="ajax.php" id="form_vopros_expert" class="feedback col-6 offset-md-3" method="post">
<input type="checkbox" id="garant_ch_expert" checked="checked"> <label for="garant_ch_expert">Соглашаюсь на <a href="/contacts/politika-konfidentsialnosti/" target="_blank">обработку персональных данных</a></label>


feedback.js file code
$(document).ready(function(){
  
  $('.files').click(function(){
        $(this).closest('form').find('input[type=file]').click();
  });

    $('input[type=file]').change(function(){
        var form = $(this).closest('form');
    	var count = form.find("input:file")[0].files.length;
    	form.find('.files span').text('Выбрано '+count+' файл(ов)');
    });
  
  /* date form */
  $(function () {
    $('.datepicker').datepicker({
            closeText: 'Закрыть',
      prevText: 'Предыдущий',
            format:'d.m.Y',
      nextText: 'Следующий',
      monthNames : ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
      dayNamesMin : ['Вс','Пн','Вт','Ср','Чт','Пт','Сб']
    });
    $('.sel1 select').change(function(){
      $('.sel1 select').css({'color':'black'});
    });
    $('.sel2 select').change(function(){
      $('.sel2 select').css({'color':'black'});
    });
  });

  /* FORM EXPERT */
  
  $("#form_vopros_expert").submit(function(event){
    event.preventDefault();
    var formData = new FormData(this);
    if($('#garant_ch_expert').prop('checked')){
      $.ajax({
        url: "/lib/feedback/mail-form.php",
        type: "post",
        data: formData,
        success: function(data) {
          $("#titlepop_expert").html('<div class="thanks_form">'+data+'</div>');
        },
        error: function(){
          alert("Ваша заявка не отправлена! Попробуйте еще раз");
        },
        cache: false,
            contentType: false,
            processData: false
      });	
      $("#garant_error_expert").html("");
    } else {$("#garant_error_expert").html("Необходимо дать согласие");}	
  });


Mail-form.php handler code
<?php

    require('config.php');
  use PHPMailer\PHPMailer\PHPMailer;
  use PHPMailer\PHPMailer\Exception;
  use PHPMailer\PHPMailer\SMTP;

  require 'PHPMailer/src/Exception.php';
  require 'PHPMailer/src/PHPMailer.php';
  require 'PHPMailer/src/SMTP.php';

  $mail = new PHPMailer(true);
    

global $APPLICATION;
    
    $dlina = htmlspecialchars(stripslashes(trim($_POST['form_dlina'])));
     $shirina = htmlspecialchars(stripslashes(trim($_POST['form_shirina'])));
      $plotnost = htmlspecialchars(stripslashes(trim($_POST['form_plotnost'])));
       $obiom = htmlspecialchars(stripslashes(trim($_POST['form_obiom'])));
      
    
    $name = htmlspecialchars(stripslashes(trim($_POST['form_name'])));
  $phone = htmlspecialchars(stripslashes(trim($_POST['form_phone'])));
  $email = htmlspecialchars(stripslashes(trim($_POST['form_email'])));
    $date = htmlspecialchars(stripslashes(trim($_POST['form_date'])));
    $time = htmlspecialchars(stripslashes(trim($_POST['form_time'])));
    $work = htmlspecialchars(stripslashes(trim($_POST['form_work'])));
  $message = htmlspecialchars(stripslashes(trim($_POST['form_message'])));
  
  $tovar = htmlspecialchars(stripslashes(trim($_POST['tovar'])));
  $title = htmlspecialchars(stripslashes(trim($_POST['title'])));
  
    
    $text = '';
    
    	$text .= (!empty($tovar))?'<p><strong>tovar:</strong> '.$tovar.'</p>':'';
    $text .= (!empty($name))?'<p><strong>name:</strong> '.$name.'</p>':'';
    $text .= (!empty($phone))?'<p><strong>phone:</strong> '.$phone.'</p>':'';
  $text .= (!empty($email))?'<p><strong>email:</strong> '.$email.'</p>':'';
    $text .= (!empty($date))?'<p><strong>date:</strong> '.$date.'</p>':'';
    $text .= (!empty($time))?'<p><strong>time:</strong> '.$time.'</p>':'';
    $text .= (!empty($work))?'<p><strong>usluga:</strong> '.$work.'</p>':'';
  $text .= (!empty($message))?'<p><strong>message:</strong> '.$message.'</p>':'';
  
  $text .= (!empty($dlina))?'<p><strong>dlina/dlina namotky:</strong> '.$dlina.'</p>':'';
    $text .= (!empty($shirina))?'<p><strong>shirina:</strong> '.$shirina.'</p>':'';
      $text .= (!empty($plotnost))?'<p><strong>plotnost/tolshina:</strong> '.$plotnost.'</p>':'';
        $text .= (!empty($obiom))?'<p><strong>obiom zakupki:</strong> '.$obiom.'</p>':'';
        
    
    $text .= (!empty($title))?'<p><strong>tovar:</strong> '.$title.'</p>':'';
    $text .= (!empty($_SERVER['HTTP_REFERER']))?'<p><strong>url:</strong> '.$_SERVER['HTTP_REFERER'].'</p>':'';
  
  $mail->isSMTP();
  $mail->Host = $host;
  $mail->SMTPAuth = true;
  $mail->Username = $login;
  $mail->Password = $pass;
  $mail->SMTPSecure = 'ssl';
  $mail->Port = 465;
   
  $mail->From = $from;
  $mail->FromName = $fromname;
  $mail->addAddress($to);
  $mail->isHTML(true);
   
  $mail->Subject = $subject;
  $mail->Body    = $text;
  $mail->AltBody = $text;
  



  if(!empty($_FILES['files'])){
        $sizes = 0;
    foreach($_FILES['files']['name'] as $key => $val){
            $name = $_FILES['files']['name'][$key];
            $name = str_replace(' ', '_', $name);
            if($name == '') continue;
            $type = $_FILES['files']['type'][$key];
            $tmp_name = $_FILES['files']['tmp_name'][$key];
            $error = $_FILES['files']['error'][$key];
            $size = $_FILES['files']['size'][$key];

            if($error > 0){
                echo 'Произошла ошибка при загрузке файла "'.$name.'"';
        exit;
            }

      $ext = strtolower(substr($name, strpos($name,'.'), strlen($name)-1));
      if(!in_array($ext, $extensions)){
        echo 'Тип файла "'.$name.'" запрещен к загрузке';
        exit;
      }

      $sizes += $size;
      if($sizes > $maxSize){
        echo 'Суммарный объем файлов превышает 10Мб';
        exit;
      }

      $tt = explode('/',$tmp_name);
      $tt = $tt[count($tt) - 1];
      $namefile = $tt.$ext;
      $mail->addAttachment($tmp_name,$namefile);
    }
  }

  try {

  $mail->send();

  echo 'Спасибо! Ваша заявка отправлена';
  } catch (Exception $e) {
    echo 'Ваша заявка не отправлена! Попробуйте еще раз. Ошибка: ', $mail->ErrorInfo;
  }


?>

Answer the question

In order to leave comments, you need to log in

1 answer(s)
S
SKEPTIC, 2022-04-13
@pro100chel

So you don't have a captcha handler on the backend.
In the same article that you posted, such a captcha processor is presented.

poke
<?php
require_once 'config.php';
session_start();
if(!empty($_POST) && $_POST['sid'] == session_id()) {
    $token_v2 = $_POST['captcha_token_v2'];
    $token_v3 = $_POST['captcha_token_v3'];
    $result = checkCaptcha($token_v2, $token_v3);
    die(json_encode($result, true));
}

function checkCaptcha($token_v2 = false, $token_v3 = false)
{
    // если не передано ни одного токена - возвращаем ошибку
    if (!$token_v3 && !$token_v2) {
        return ['error' => 'fall_captcha'];
    }
    // если дело дошло до капчи второй версии
    elseif ($token_v2) {
        // проверяем информацию по второй версии, если google ответил, что провека успешная - возвращаем успех
        $result = checkCaptchaCurl($token_v2, KEY_SECRET_V2);
        if (!$result['success']) {
            // если проверка провалилась - тоже ошибка
            return ['error' => 'fall_captcha_v2'];
        }
    }
    // если токен второй версии еще не получен, но есть 3, значит проверяем невидимую капчу
    else {
        $result = checkCaptchaCurl($token_v3, KEY_SECRET_V3);
        // проверяем количество очков от 0 до 1. Чем ближе к 1, тем больше вероятности, что это человек
        if ($result['score'] < 1) {
            return ['error' => 'fall_captcha_v3'];
        }
    }
    // возвращаем успех, если проверки пройдены
    $text = 'Your message "' . $_POST['text'] . '" was send to email "' . $_POST['email'] . '" successfully';
    return ['success' => true, 'text' => $text];
}

/**
 * Метод для отправки запроса в google через CURL
 * @param $response
 * @param $secret
 * @return mixed
 */
function checkCaptchaCurl($response, $secret)
{
    $url_data = 'https://www.google.com/recaptcha/api/siteverify' . '?secret=' . $secret . '&response=' . $response . '&remoteip=' . $_SERVER['REMOTE_ADDR'];
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url_data);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $captcha_res = curl_exec($curl);
    curl_close($curl);
    $captcha_res = json_decode($captcha_res, true);
    return $captcha_res;
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question