Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne][HTML][PHP]Dodawanie reCAPTCHA do formularza W PHP
Forum PHP.pl > Forum > Przedszkole
b1aster
Przeszukałem forum i niestety nie mogę znaleźć odpowiedzi na mój problem z formularzem. Mianowicie pomimo dodania do kodu strony wszystkiego co konieczne, formularz ciągle można wysłać, bez względu na to czy zaznaczę pole reCAPTCHA, czy też nie. Poniżej pozwolę sobie wrzucic kod:
Początkowe w <head> strony wrzucam:
  1. <script src='https://www.google.com/recaptcha/api.js'></script>


Będę ogromnie wdzięczny gdyby ktoś zechciał rzucić na to okiem, bo podejrzewam że to coś banalnego a umyka mi to przez moją słabą znajomość tematu.

Kod formularza jest trochę przekombinowany i może to sama jego forma uniemożliwia zastosowanie reCAPTCHy i trzeba go "wykodzić" od nowa?

Kod strony z formularzem i kod PHP wygląda tak:

  1. <?php
  2. if (count($_POST))
  3. {
  4. ////////// USTAWIENIA //////////
  5. $email = 'mail@mail'; // Adres e-mail na który przychodzi zapytanie z formularza
  6. $subject = 'Zapytanie ze strony WWW'; // Temat listu
  7. $message = ''; // Komunikat
  8. $error = 'Wystąpił błąd podczas wysyłania wiadomości'; // Komunikat błędu
  9. $charset = 'utf-8'; // Strona kodowa
  10. //////////////////////////////
  11.  
  12. $head =
  13. "MIME-Version: 1.0\r\n" .
  14. "Content-Type: text/plain; charset=$charset\r\n" .
  15. "Content-Transfer-Encoding: 8bit";
  16. $body = '';
  17. foreach ($_POST as $name => $value)
  18. {
  19. if (is_array($value))
  20. {
  21. for ($i = 0; $i < count($value); $i++)
  22. {
  23. $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value[$i]) : $value[$i]) . "\r\n";
  24. }
  25. }
  26. else $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value) : $value) . "\r\n";
  27. }
  28. echo mail($email, "=?$charset?B?" . base64_encode($subject) . "?=", $body, $head) ? $message : $error;
  29. }
  30. else
  31. {
  32. ?>
  33. <form action="" method="post">
  34. <div class="contact-w3ls-row">// klasa definiujące wygląd formularza*
  35. <div class="col-md-5 col-sm-5 contact-right agileits-w3layouts"> // klasa definiujące wygląd formularza*
  36. <textarea name="Tresć wiadomości" placeholder="Treść Zapytania" required=""></textarea>
  37. </div>
  38. <div class="col-md-7 col-sm-7 contact-left agileits-w3layouts">// klasa definiujące wygląd formularza*
  39. <input type="text" name="Imię" placeholder="Imię" required="">
  40. <input class="email" name="Nazwisko" type="text" placeholder="Nazwisko" required="">
  41. <input type="text" name="Numer tel." placeholder="Numer Telefonu" pattern="[0-9]{3}[0-9]{3}[0-9]{3}" required="">
  42. <input class="email" name="Email" type="email" placeholder="E-mail" required="">
  43. <input type="submit" name="submit" value="WYŚLIJ">
  44. <br /><br />
  45. <div class="g-recaptcha" data-sitekey="6Lcwx....SITE KEY"></div>
  46. <br /><br />
  47. <label class="zgoda"><input type="checkbox" required=""> <font size="2">Wyrażam zgodę na przetwarzanie moich danych osobowych,w związku z udzieleniem odpowiedzi na wiadomość e-mail wysłaną za pośrednictwem strony blablabla.pl zgodnie z ustawą o ochronie danych osobowych. Zostałem /am poinformowany /a, że przysługuje mi prawo dostępu do swoich danych, możliwości ich poprawiania oraz żądania zaprzestania ich przetwarzania.</font></label>
  48. </div>
  49. <div class="clearfix"> </div>
  50. </form>
  51. <?php
  52. } // w tym miejscu, po tym nawiasie był tylko znacznik zamknięcia kodu PHP wysyłającego formularz, ale żeby reCAPTCHA działała, konieczne jest dodanie poniższego ifa
  53. if (isset($_POST['submit'])) {
  54. $secret = '6L.... SECRET KEY';
  55. $response = $_POST['g-recaptcha-response'];
  56. $remoteip = $_SERVER['REMOTE_ADDR'];
  57.  
  58. $url = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$secret&response=$response&remoteip=$remoteip");
  59. $result = json_decode($url, TRUE);
  60. if ($result['success'] == 1) {
  61. echo 'Nie jesteś botem';
  62. }else{
  63. echo 'Błędnie wypełnione pole reCAPTCHA';
  64. }
  65. }
  66. ?>


* rzeczy nieistotne
viking
Raczej logicznym jest że walidacja powinna być przed wysyłką maila
. U ciebie jest jakiś podział na dwa.
Smoker
Analizując od od góry do dołu co się dzieje (kolejno wierszami):

1. Jeżeli jest dostępny jakiś formularz - if (count($_POST))
28. To wyślij email - echo mail($email, "=?$charset?B?"
60. Następnie (już po wysyłce maila) sprawdź dodatkowo czy użytkownik jest botem, i odpowiednio go przywitaj wyświetlając treść powitania na stronie - if ($result['success'] == 1)

W Twojej logice jest sprawdzenie reCaptcha, ale jakieś 30 linijek po tym, jak już wyślesz email. Takiego ifa musisz napisać przez wysyłką maila, uzależniając od niego czy ten mail zostanie wysłany. Funkcja "email" odpowiada za wysyłkę
dublinka
Ale bajzel na u szwagra po imieninach.

Co to:

  1. echo mail(.....)

🤣

I po kiego sprawdzanie calej tablicy post 🤔
b1aster
Cytat(Smoker @ 19.03.2021, 22:16:03 ) *
W Twojej logice jest sprawdzenie reCaptcha, ale jakieś 30 linijek po tym, jak już wyślesz email. Takiego ifa musisz napisać przez wysyłką maila, uzależniając od niego czy ten mail zostanie wysłany. Funkcja "email" odpowiada za wysyłkę


Super. Dzięki ogromne za rzeczowe wyjaśnienie przyczyny problemu. Al czy mógłbym prosić o wskazówkę gdzie byłoby najlepiej wsadzić tego ifa od reCaptcha żeby to chciało się wysyłać? Powiem szczerze, że już chyba próbowałem wszystkiego i kicha sciana.gif Albo formularz nie działa w ogóle, albo działa i ma w nosie Captchę.

Czy po prostu napisać tego forma od początku? Zdaję sobie że jest w tym kodzie masa błędów i dałoby się zrobić to lepiej, ale ten kod ma tę zaletę że jest dość mobilny.

Będę bardzo wdzięczny za sugestie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.