новый google recaptcha с флажком на стороне сервера php

Я только что установил новый google recaptcha с флажком, он отлично работает на стороне сайта, однако я не знаю, как это сделать на стороне сервера, используя php, я попытался использовать старый код ниже, но форма отправляется, даже если recaptcha не используется.

require_once('recaptchalib.php'); $privatekey = "my key"; $resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); if (!$resp->is_valid) { $errCapt='<p style="color:#D6012C ">The CAPTCHA Code wasnot entered correctly.</p>';} 

Solutions Collecting From Web of "новый google recaptcha с флажком на стороне сервера php"

это решение

index.html

 <html> <head> <title>Google recapcha demo - Codeforgeek</title> <script src='https://www.google.com/recaptcha/api.js'></script> </head> <body> <h1>Google reCAPTHA Demo</h1> <form id="comment_form" action="form.php" method="post"> <input type="email" placeholder="Type your email" size="40"><br><br> <textarea name="comment" rows="8" cols="39"></textarea><br><br> <input type="submit" name="submit" value="Post comment"><br><br> <div class="g-recaptcha" data-sitekey="=== Your site key ==="></div> </form> </body> </html> 

verify.php

 <?php $email;$comment;$captcha; if(isset($_POST['email'])) $email=$_POST['email']; if(isset($_POST['comment'])) $comment=$_POST['comment']; if(isset($_POST['g-recaptcha-response'])) $captcha=$_POST['g-recaptcha-response']; if(!$captcha){ echo '<h2>Please check the the captcha form.</h2>'; exit; } $response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR SECRET KEY&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true); if($response['success'] == false) { echo '<h2>You are spammer ! Get the @$%K out</h2>'; } else { echo '<h2>Thanks for posting comment.</h2>'; } ?> , <?php $email;$comment;$captcha; if(isset($_POST['email'])) $email=$_POST['email']; if(isset($_POST['comment'])) $comment=$_POST['comment']; if(isset($_POST['g-recaptcha-response'])) $captcha=$_POST['g-recaptcha-response']; if(!$captcha){ echo '<h2>Please check the the captcha form.</h2>'; exit; } $response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR SECRET KEY&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true); if($response['success'] == false) { echo '<h2>You are spammer ! Get the @$%K out</h2>'; } else { echo '<h2>Thanks for posting comment.</h2>'; } ?> , <?php $email;$comment;$captcha; if(isset($_POST['email'])) $email=$_POST['email']; if(isset($_POST['comment'])) $comment=$_POST['comment']; if(isset($_POST['g-recaptcha-response'])) $captcha=$_POST['g-recaptcha-response']; if(!$captcha){ echo '<h2>Please check the the captcha form.</h2>'; exit; } $response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR SECRET KEY&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true); if($response['success'] == false) { echo '<h2>You are spammer ! Get the @$%K out</h2>'; } else { echo '<h2>Thanks for posting comment.</h2>'; } ?> , <?php $email;$comment;$captcha; if(isset($_POST['email'])) $email=$_POST['email']; if(isset($_POST['comment'])) $comment=$_POST['comment']; if(isset($_POST['g-recaptcha-response'])) $captcha=$_POST['g-recaptcha-response']; if(!$captcha){ echo '<h2>Please check the the captcha form.</h2>'; exit; } $response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR SECRET KEY&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true); if($response['success'] == false) { echo '<h2>You are spammer ! Get the @$%K out</h2>'; } else { echo '<h2>Thanks for posting comment.</h2>'; } ?> 

http://codeforgeek.com/2014/12/google-recaptcha-tutorial/

Безопасность секретного ключа

Хотя ответы здесь определенно работают, они используют запрос GET , который предоставляет ваш закрытый ключ (хотя используется https ). В Google Developers указанным методом является POST .

Проверка через POST

 function isValid() { try { $url = 'https://www.google.com/recaptcha/api/siteverify'; $data = ['secret' => '[YOUR SECRET KEY]', 'response' => $_POST['g-recaptcha-response'], 'remoteip' => $_SERVER['REMOTE_ADDR']]; $options = [ 'http' => [ 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data) ] ]; $context = stream_context_create($options); $result = file_get_contents($url, false, $context); return json_decode($result)->success; } catch (Exception $e) { return null; } } 

Синтаксис массива: я использую синтаксис «нового» массива ( [ и ] вместо array(..) ). Если ваша версия php еще не поддерживает это, вам придется соответствующим образом отредактировать эти 3 определения массива (см. Комментарий).

Возвращаемые значения: эта функция возвращает значение true если пользователь действителен, false если нет, и null если произошла ошибка. Вы можете использовать его, например, просто, написав if (isValid()) { ... }

Я не поклонник ни одного из этих решений. Я использую это вместо этого:

 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, [ 'secret' => $privatekey, 'response' => $_POST['g-recaptcha-response'], 'remoteip' => $_SERVER['REMOTE_ADDR'] ]); $resp = json_decode(curl_exec($ch)); curl_close($ch); if ($resp->success) { // Success } else { // failure } 

Я бы сказал, что это превосходно, потому что вы обеспечиваете его отправку на сервер и не вызываете неудобного вызова «file_get_contents». Это совместимо с recaptcha 2.0, описанным здесь: https://developers.google.com/recaptcha/docs/verify

Я нахожу это чище. Я вижу, что большинство решений – file_get_contents, когда я чувствую, что завиток будет достаточно.

Легкое и лучшее решение заключается в следующем.
index.html

 <form action="submit.php" method="POST"> <input type="text" name="name" value="" /> <input type="text" name="email" value="" /> <textarea type="text" name="message"></textarea> <div class="g-recaptcha" data-sitekey="Insert Your Site Key"></div> <input type="submit" name="submit" value="SUBMIT"> </form> 

submit.php

 <?php if(isset($_POST['submit']) && !empty($_POST['submit'])){ if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])){ //your site secret key $secret = 'InsertSiteSecretKey'; //get verify response data $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']); $responseData = json_decode($verifyResponse); if($responseData->success){ //contact form submission code goes here $succMsg = 'Your contact request have submitted successfully.'; }else{ $errMsg = 'Robot verification failed, please try again.'; } }else{ $errMsg = 'Please click on the reCAPTCHA box.'; } } ?> 

Я нашел эту ссылку и полный учебник отсюда – Использование новой reCAPTCHA Google с PHP

Мне понравился ответ Левита, и он использовал его. Но я просто хотел указать, на всякий случай, что есть официальная библиотека Google PHP для новой reCAPTCHA: https://github.com/google/recaptcha

Последняя версия (прямо сейчас 1.1.2) поддерживает Composer и содержит пример, который вы можете запустить, чтобы убедиться, что вы все правильно настроили.

Ниже вы можете увидеть часть примера, которая поставляется с этой официальной библиотекой (с моими незначительными изменениями для ясности):

 // Make the call to verify the response and also pass the user's IP address $resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']); if ($resp->isSuccess()) { // If the response is a success, that's it! ?> <h2>Success!</h2> <p>That's it. Everything is working. Go integrate this into your real project.</p> <p><a href="/">Try again</a></p> <?php } else { // If it's not successful, then one or more error codes will be returned. ?> <h2>Something went wrong</h2> <p>The following error was returned: <?php foreach ($resp->getErrorCodes() as $code) { echo '<tt>' , $code , '</tt> '; } ?></p> <p>Check the error code reference at <tt><a href="https://developers.google.com/recaptcha/docs/verify#error-code-reference">https://developers.google.com/recaptcha/docs/verify#error-code-reference</a></tt>. <p><strong>Note:</strong> Error code <tt>missing-input-response</tt> may mean the user just didn't complete the reCAPTCHA.</p> <p><a href="/">Try again</a></p> <?php } 

Надеюсь, это поможет кому-то.

В приведенном выше примере. Для меня эта if($response.success==false) не работает. Вот правильный код PHP:

 $url = 'https://www.google.com/recaptcha/api/siteverify'; $privatekey = "--your_key--"; $response = file_get_contents($url."?secret=".$privatekey."&response=".$_POST['g-recaptcha-response']."&remoteip=".$_SERVER['REMOTE_ADDR']); $data = json_decode($response); if (isset($data->success) AND $data->success==true) { // everything is ok! } else { // spam } 

Проверить на стороне сервера с помощью PHP. Две самые важные вещи, которые вам нужно учитывать.

 1. $_POST['g-recaptcha-response'] 2.$secretKey = '6LeycSQTAAAAAMM3AeG62pBslQZwBTwCbzeKt06V'; $verifydata = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secretKey.'&response='.$_POST['g-recaptcha-response']); $response= json_decode($verifydata); 

Если вы получите $ verifydata true , вы сделали .
Для получения дополнительной информации об этом
Google reCaptcha Использование PHP | Только 2-х ступенчатая интеграция

он похож на mattgen88, но я только что зафиксировал CURLOPT_HEADER и переопределил массив, чтобы он работал на хост-сервере domain.com. этот не работает на моем xampp localhost. Эта небольшая ошибка, но потребовалось много времени, чтобы разобраться. этот код был протестирован на хостинге domain.com.

  $privatekey = 'your google captcha private key'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify"); curl_setopt($ch, CURLOPT_HEADER, 'Content-Type: application/json'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'secret' => $privatekey, 'response' => $_POST['g-recaptcha-response'], 'remoteip' => $_SERVER['REMOTE_ADDR'] ) ); $resp = json_decode(curl_exec($ch)); curl_close($ch); if ($resp->success) { // Success echo 'captcha'; } else { // failure echo 'no captcha'; } 

Здесь у вас простой пример. Просто не забудьте предоставить secretKey и siteKey из google api.

 <?php $siteKey = 'Provide element from google'; $secretKey = 'Provide element from google'; if($_POST['submit']){ $username = $_POST['username']; $responseKey = $_POST['g-recaptcha-response']; $userIP = $_SERVER['REMOTE_ADDR']; $url = "https://www.google.com/recaptcha/api/siteverify?secret=$secretKey&response=$responseKey&remoteip=$userIP"; $response = file_get_contents($url); $response = json_decode($response); if($response->success){ echo "Verification is correct. Your name is $username"; } else { echo "Verification failed"; } } ?> <html> <meta> <title>Google ReCaptcha</title> </meta> <body> <form action="index.php" method="post"> <input type="text" name="username" placeholder="Write your name"/> <div class="g-recaptcha" data-sitekey="<?= $siteKey ?>"></div> <input type="submit" name="submit" value="send"/> </form> <script src='https://www.google.com/recaptcha/api.js'></script> </body>