reCaptcha показывает сообщение об успехе даже при неудаче - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть контактная форма в HTML, и форма обрабатывается файлом PHP. ReCaptcha, кажется, работает, но всегда показывает сообщение об успехе, даже в случае сбоя. Я имею в виду, что пользователь может отправить форму БЕЗ нажатия кнопки «Я не робот», и сообщение НЕ будет отправлено мне, но на странице оно отображается пользователю так, как если бы оно было, потому что оно показывает сообщение об успехе.

Идеи о том, что это вызывает и как это исправить? (У меня есть правильные ключи в коде, я просто вытащил их для этого поста)

Вот код HTML ::

image

Вот полный код PHP:

<?php

//reCAPTCHA validation
//Checking For reCAPTCHA
$captcha;
if (isset($_POST['g-recaptcha-response'])) {
    $captcha = $_POST['g-recaptcha-response'];
}
// Checking For correct reCAPTCHA
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=my _secret_key_is_here_&response=" . $captcha);
if (!$captcha || $response.success == false) {
    echo "Your CAPTCHA response was wrong.";
    exit ;
}


    $to = "my_email_is_here";
    $from = $_REQUEST['email'];
    $name = $_REQUEST['name'];
    $csubject = $_REQUEST['subject'];
    $number = $_REQUEST['number'];
    $cmessage = $_REQUEST['message'];

    $headers = "From: $from";
    $headers = "From: " . $from . "\r\n";
    $headers .= "Reply-To: ". $from . "\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

    $subject = "You have a message from SoltonPhoto.com.";

    $logo = '../img/logo.png';
    $link = '#';

    $body = "<!DOCTYPE html><html lang='en'><head><meta charset='UTF-8'><title>Express Mail</title></head><body>";
    $body .= "<table style='width: 100%;'>";
    $body .= "<thead style='text-align: center;'><tr><td style='border:none;' colspan='2'>";
    $body .= "<a href='{$link}'><img src='{$logo}' alt=''></a><br><br>";
    $body .= "</td></tr></thead><tbody><tr>";
    $body .= "<td style='border:none;'><strong>Name:</strong> {$name}</td>";
    $body .= "<td style='border:none;'><strong>Email:</strong> {$from}</td>";
    $body .= "</tr>";
    $body .= "<tr><td style='border:none;'><strong>Subject:</strong> {$csubject}</td></tr>";
    $body .= "<tr><td></td></tr>";
    $body .= "<tr><td colspan='2' style='border:none;'>{$cmessage}</td></tr>";
    $body .= "</tbody></table>";
    $body .= "</body></html>";

    $send = mail($to, $subject, $body, $headers);

?>

1 Ответ

0 голосов
/ 12 февраля 2020

Еще один хороший пример того, почему вы не должны отключать какие-либо ошибки при разработке:

Warning: Use of undefined constant success - assumed 'success' (this will throw an Error in a future version of PHP) stackoverflow.php on line 5

В основном это следующая строка:

var_dump($response.success);

, потому что $response просто string, а не объект, к полям которого вы могли бы получить доступ.

HTTP-вызов recaptcha возвращает json, который необходимо сначала проанализировать с помощью функции json_decode:

$response = json_decode($response,true);

Затем вы можете получить доступ к значению success через ассоциативный массив:

$response['success']

Что приведет к:

$isValid = false;
if (isset($_POST['g-recaptcha-response'])) {
    $captcha = $_POST['g-recaptcha-response'];
    $response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=my_private_key_was_here_&response=" . $captcha);
    $response = json_decode($response,true);
    $isValid = $response['success'];
}

if (!$isValid) {
    echo "Your CAPTCHA response was wrong.";
    exit ;
}

, которое также уже оптимизировано потому что он не запускает HTTP-запрос, когда не установлена ​​капча.

Кроме того, вы должны действительно использовать var_dump и печатать материал в своем собственном коде при разработке. Мог бы сэкономить много времени.

...