Интеграция Google ReCaptcha в существующую форму оплаты

Недавно мой сайт получал много спама через форму оплаты, и я решил, что мне нужно добавить captcha чтобы предотвратить это.

Я искал несколько вариантов, и я решил пойти с Googles reCaptcha, Кажется, его достаточно легко настроить и использовать, но я столкнулся с несколькими проблемами.

Во-первых, я включил это script в заголовке формы:

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

Затем я включил на самом деле captcha Сам у подножия формы:

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

Когда я отправляю форму, я делаю следующее:

$captcha = $_POST["g-recaptcha-response"]; //Get Captcha token
$secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //Get Secret key
$google_response = http_get("https://www.google.com/recaptcha/api/siteverify", array("secret"=>$secret, "response"=>$captcha), $info); //perform Get request
print_r($info);

Но ничего не происходит, на самом деле страница, которая раньше работала, просто зависает и даже не отображает сообщение об ошибке. Есть идеи, что я могу делать не так? Исходя из моего понимания документации, ответ будет в JSON и успех будет либо истинным, либо ложным, я хотел бы продолжить оплату, если верно, или остановить и вернуться к форме, если ложь.

Буду признателен за любую оказанную помощь. Или, если у кого-то есть альтернативное решение для добавления капчи, я хотел бы изучить это.

5

Решение

Попробуйте запустить Google Recaptcha 2015:

==PHP Verification==
if(isset($_POST['submit'])){
$userIP = $_SERVER["REMOTE_ADDR"];
$recaptchaResponse = $_POST['g-recaptcha-response'];
$secretKey = "SECRET_KEY";
$request = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secretKey}&response={$recaptchaResponse}&remoteip={$userIP}");

if(!strstr($request, "true")){
echo "NOPE (Failed Verification)";
}
else{
echo "YUP (Successful Verification)";
}
}
12

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

Не используйте file_get_contents. Google рекомендует использовать POST-запросы называть их API. GET-запросы, как указано выше, могут привести к нескольким проблемам:

  • он может быть заблокирован для вызова по URL из-за безопасности (allow_url_fopen)
  • пользователь может передать что-то вроде someToken&secret = otherSitesSecret в качестве входных данных для вашего $ _POST [g-recaptcha-response]. Если вы просто ввели строку с вызываемым URL-адресом, вы передадите другой секрет в Google. Затем пользователи могут проверить себя с любым ответом recaptcha, который они получили с любого сайта. Это проблема безопасности.
  • токены, которые возвращает Google, могут быть довольно длинными. Веб-серверы поддерживают только несколько тысяч символов в URL. Это может привести к обрыву строк, и вы получите ошибку для допустимых входных данных.

Следовательно, использовать что-то вроде этого:

// Get resource
$curl = curl_init();

// Configure options, incl. post-variables to send.
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array(
'secret' => 'your_secret_code_here',
'response' => $_POST['g-recaptcha-response']
)
));

// Send request. Due to CURLOPT_RETURNTRANSFER, this will return reply as string.
$resp = curl_exec($curl);

// Free resources.
curl_close($curl);

// Validate response
if(strpos($resp, '"success": true') !== FALSE) {
echo "Verified.";
} else {
echo "Not verified.";
}

Кроме того, часть проверки более консервативна в том, что она принимает как «проверенная».

7