Борьба с recaptcha v2 и отправка формы

https://developers.google.com/recaptcha/docs/verify

if(isset($_POST['submit'])){
$recaptchaResponse = $_POST['g-recaptcha-response'];
$secretKey = 'MYKEY';
$request = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$recaptchaResponse);

if(!strstr($request,"false")){
echo '<div class="notification error clearfix"><p><strong>Attention!</strong> You didnt complete the captcha.</p></div>';
exit();

Затем остальная часть php-файла отправляет форму по почте, но в любом случае она просто отправляется, даже если вы не завершили recaptcha. В основном, если JSON возвращает false, я надеялся, что он не отправит и отобразит ошибку

Также вот форма со страницы, если это помогает, я, вероятно, тоже что-то сделал не так …

<form method="POST" action="post.php" name="contactform" id="contactform" class="container">

<fieldset>
<div class="form-field grid-half">
<label for="name">Name</label>
<span><input type="text" name="name" id="name" /></span>
</div>
<div class="form-field grid-half">
<label for="email">Email</label>
<span><input type="email" name="email" id="email" /></span>
</div>
<div class="form-field grid-full">
<label for="message">Message</label>
<span><textarea name="message" id="message"></textarea></span>
</div>
<div class="form-field grid-full">
<div class="g-recaptcha" data-sitekey="MYKEY"></div>
</div>
</fieldset>
<div class="form-click grid-full">
<span><input type="submit" name="submit" value="Submit" id="submit" /></span>
</div>

<div id="alert" class="grid-full"></div>
</form>

13

Решение

Я обнаружил, что иногда, в зависимости от версии / конфигурации PHP, прямой доступ к объекту не будет работать, поэтому используйте json_decode(),

$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR_SECRET_KEY&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']);
$obj = json_decode($response);
if($obj->success == true)
{
//passes test
}
else
{
//error handling
}
23

Другие решения

С помощью curl вместо file_get_contents (если вы, как и я, хотите file_get_contents быть отключенным в настройках сервера)

$post_data = "secret=__your_secret_key__&response=".
$_POST['g-recaptcha-response']."&remoteip=".$_SERVER['REMOTE_ADDR'] ;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array('Content-Type: application/x-www-form-urlencoded; charset=utf-8',
'Content-Length: ' . strlen($post_data)));
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$googresp = curl_exec($ch);
$decgoogresp = json_decode($googresp);
curl_close($ch);

if ($decgoogresp->success == true)
{
// Success
}
18

Вставьте этот фрагмент перед закрывающим тегом в HTML-шаблон:

<script src='https://www.google.com/recaptcha/api.js'></script>

Вставьте этот фрагмент в конец того места, где вы хотите, чтобы появился виджет reCAPTCHA:

<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>

Пример :

<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>

form.php

<?php

$email;$comment;$captcha;
if(isset($_POST['email'])){
$email=$_POST['email'];
}if(isset($_POST['comment'])){
$email=$_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=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR_SECRET_KEY&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']);
if($response.success==true)
{
echo '<h2>Thanks for posting comment.</h2>';
}
?>

Сорс:

4

Во-первых, ответы, приведенные здесь, абсолютно адекватны.
При этом я просто хотел включить эту функцию, которая упаковывает эти ответы в несколько более удобный метод, чтобы вы могли выбросить их в свою библиотеку функций и почти забыть об этом, пока Google не изменит что-то. Наслаждайтесь!

//Put these two functions into your function library-------
function CaptchaVerify($apiSecret)
{
//Returns -1 if no captcha response was in post(user did not submit form)
//Returns 0 if the verification fails
//Returns 1 if the verification succeeds
$captcha = isset($_POST['g-recaptcha-response'])? "&response=".$_POST['g-recaptcha-response']:'';
if($captcha != '')
{
$verifyUrl = "https://www.google.com/recaptcha/api/siteverify";
$apiSecret = "?secret=".$apiSecret;
$remoteip = "&remoteip=".$_SERVER['REMOTE_ADDR'];
$response=file_get_contents($verifyUrl.$apiSecret.$captcha.$remoteip);
$obj = json_decode($response);
return (integer)$obj->success;
}
return -1;
}
function MyCaptchaVerify()
{
$apiSecret = "PUT YOUR CAPTCHA SECRET HERE";
return CaptchaVerify($apiSecret);
}
//-------------------------------------------------------
//Example usage in your form
switch(MyCaptchaVerify())
{
case -1:echo "The form has not been submitted yet(First Load).<br>";break;
case  0:echo "The captcha verification failed.<br>";    break;
case  1:echo "The captcha verification succeeded.<br>"; break;
}
4

Я предпочитаю пример cURL файлу file_get_contents, так как он дает больше возможностей для регистрации ошибок и тому подобного. Некоторые считают CURL довольно пугающим, хотя. Для тех пользователей Guzzle — очень хорошая альтернатива.

1
if (response == true) {
mail();
} else {
echo "error";
}
-5
По вопросам рекламы [email protected]