Нужно ли проверять результат для Google Invisible reCaptcha
Я следую инструкциям на этой странице, чтобы реализовать невидимую recaptcha. Все отлично работает, но как мне узнать, что это работает? Есть ли способ заставить ложное проверить это?
Кроме того, документация не ясна на приведенной выше странице, но в некоторых местах есть дополнительный код для проверки "ответа" пользователей (он невидим, поэтому я не уверен, что ответ здесь) - поэтому мне нужно добавить дополнительный сервер логика поразить эту конечную точку с невидимым reCaptcha
полученный токен и мой секретный ключ?
Что происходит, когда пользователь нажимает кнопку "Отправить" на невидимом отчете? Что делается в API для возврата токена? Для чего нужен токен? Что делает сайт veverify api, чтобы определить его личность? Почему не требуется дополнительная проверка при использовании reCAPTCHA V2 (видимый щелчок один)?
2 ответа
После некоторого тестирования похоже, что вы могли бы просто сделать часть переднего конца. Функция обратного вызова данных не вызывается до тех пор, пока Google не будет уверен, что вы человек, если Google не уверен, тогда он загружает "выберите, какие плитки есть вещь в них", чтобы быть уверенным. Как только reCaptcha api убедится, что это человек, сработала функция обратного вызова данных - в это время вы можете выполнить дополнительную проверку, чтобы убедиться, что токен, который вы получили во время обратного вызова, тот, который Google фактически отправил, а не бот, пытающийся обмануть вас, нажав функцию обратного вызова - так что оттуда вы выполняете обработку на стороне сервера для дальнейшей проверки. Ниже приведен пример обработчика ashx для C# и ajax для проверки
function onTestSubmit(token) {
$.ajax({
type: "POST",
url: "testHandler.ashx",
data: { token: token },
success: function (response) {
if (response == "True") {
//do stuff to submit form
}
}
});
}
И ясень
public class testHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
string token = context.Request.Form["token"];
bool isCaptchaValid = ReCaptcha.Validate(token);
context.Response.Write(isCaptchaValid.ToString());
}
public bool IsReusable {
get {
return false;
}
}
}
public class ReCaptcha
{
private static string URL =
"https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}";
private static string SECRET = "shhhhhhhhhhhhhhSecretTOken";
public bool Success { get; set; }
public List<string> ErrorCodes { get; set; }
public static bool Validate(string encodedResponse)
{
if (string.IsNullOrEmpty(encodedResponse)) return false;
var client = new System.Net.WebClient();
var googleReply = client.DownloadString(string.Format(URL, SECRET, encodedResponse));
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var reCaptcha = serializer.Deserialize<ReCaptcha>(googleReply);
return reCaptcha.Success;
}
}
Да, вы делаете. Вы должны понимать, что невидимая reCaptcha - это процесс, состоящий из нескольких этапов, каждый из которых в конечном итоге дает окончательный ответ относительно человечности пользователя.
Проще говоря, когда пользователи отправляют форму (или делают все, что вы пытаетесь скрыть от ботов с помощью Invisible reCaptcha), вы будете отправлять свой общедоступный ключ сайта на свой сервер, который запустит полезную нагрузку для проверки в Google.
В моем очень простом примере это кнопка, которую, как мы надеемся, посетитель нажимает, чтобы отправить форму на моем сайте:
<button type="submit" class="g-recaptcha" data-sitekey="xxxxxxxx_obscured_xxxxxxxx" data-callback="onSubmit">Submit Form</button>
Обратите внимание, что кнопка имеет обратный вызов данных "onSubmit", который при отправке запускает этот небольшой скрипт:
<script type="text/javascript">
var onSubmit = function(response) {
document.getElementById("simpleForm").submit(); // send response to your backend service
};
</script>
Бэкэнд-сервис в моем примере - это ванильный PHP-скрипт, предназначенный для обработки ввода формы и сохранения его в базе данных, и тут возникает сложная часть. Как часть процедуры POST для бэкэнда, помимо полей формы, которую пользователь заполнил, является ответом службы (и поскольку вы можете или не можете делать много вещей на внешнем интерфейсе, где пользователь может манипулировать ответом до его опубликовано в вашей бэкэнд, ответ Google не является явным в данный момент)
На вашем бэкэнде вам нужно будет взять g-recaptcha-response, полученный от Google, и опубликовать его в API проверки с использованием вашего закрытого ключа (который не указан в форме), чтобы получить вердикт человека / робота, который Вы можете действовать на Вот простой пример, написанный на PHP и использующий API cURL:
$recaptcha_response = $_POST["g-recaptcha-response"];
$api_url = 'https://www.google.com/recaptcha/api/siteverify';
$api_secret = 'zzzzzzz_OBSCURED_SECRET_KEY_zzzzzzzzzzz';
$remoteip = '';
$data = array('secret' => $api_secret, 'response' => $recaptcha_response);
$options = array(
'http' => array(
'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($api_url, false, $context);
$captcha_response = json_decode($result, true);
// at this point I have the definite verdict from google. Should I keep processing the form?.
if ($captcha_response['success'] == true) {
// I heart you, human. Keep going
$captcha_error = 0;
}
else {
// Damn robot, die a slow and painful death
$captcha_error = 1;
}
Я принимаю окончательное решение на основе $captcha_error (в основном 1 означает останов, 0 означает продолжить обработку)
Если вы полагаетесь исключительно на получение g-recaptcha-response, значит, Google выполняет работу, а затем игнорирует результат.