2014-12-28 24 views
6

Thật kỳ lạ khi tài liệu của Google về recaptcha không hữu ích như tôi nghĩ. Tôi đã được yêu cầu lấy một biểu mẫu hiện tại (đang bị gửi spam một vài lần một ngày) và cập nhật nó bằng biểu mẫu mới của Google. Có rất nhiều hướng dẫn ở đó cho hình ảnh xác thực cũ, nhưng không nhiều cho hướng dẫn mới. Về cơ bản, tôi chỉ muốn một dạng đơn giản để lấy tên, email, tin nhắn và sau đó thay thế "trường chống bot" hiện tại bằng recaptcha (tôi đã sử dụng một trường về cơ bản đã hỏi bạn 2 + 2 là gì và nếu bạn đã nhập gì, nhưng 4, nó sẽ không gửi). Nếu các trường bắt buộc là hợp lệ và recaptcha là hợp lệ, thì tôi muốn nó gửi cho tôi một email với nội dung của các trường biểu mẫu.Biểu mẫu PHP + Google reCAPTCHA

tôi đã đi qua các bước đơn giản:

  1. đăng ký trang web của tôi để có được các phím

  2. thêm đoạn này bên trong thẻ đầu của tôi:

    <script src='https://www.google.com/recaptcha/api.js'></script> 
    
  3. thêm đoạn mã này ở cuối biểu mẫu của tôi:

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

Tại thời điểm này, recaptcha chỉ hiển thị tốt. Nhưng phần phía máy chủ là một chút bối rối.

Đây là hình thức của tôi được cập nhật tiếp xúc với reCAPTCHA hiển thị:

<form method="post" action="contact-post.php"> 
    <label>Your Name (required):</label> 
    <input name="name" type="text" placeholder="Enter your name here"> 
    <label>Email Address (required):</label> 
    <input name="email" type="email" placeholder="Enter your email address here"> 
    <label>Your Message (required):</label> 
    <textarea name="message" placeholder="Write your message here"></textarea> 
    <div style="margin-top:20px;" class="g-recaptcha" data-sitekey="#MYKEY#"></div> 
    <input id="submit" name="submit" type="submit" value="Submit Form"> 
</form> 

Và đây là trang POST hiện tại của tôi (tôi không chắc chắn nơi để thêm vào đoạn code reCAPTCHA):

<?php 
     $name = $_POST['name']; 
     $email = $_POST['email']; 
     $message = $_POST['message']; 
     $human = $_POST['human']; 
     $from = 'From: My Website'; 
     $to = '[email protected]'; 
     $subject = 'Request Form'; 

     $body = "Name: $name \n E-Mail: $email \nMessage:\n$message"; 

     if ($_POST['submit']) { 
      if ($email != '') { 
       if ($human == '4') {     
        if (mail ($to, $subject, $body, $from)) { 
         echo '<p>You have successfully submitted your information to PS4RS. Subscribers to our mailing list will begin to periodically receive updates.</p>'; 
        } else { 
         echo '<p>Something went wrong, go back and try again!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; 
        } 
       } else if ($_POST['submit'] && $human != '4') { 
        echo '<p>You answered the anti-spam question incorrectly!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; 
       } 
      } else { 
       echo '<p>You need to fill in all required fields!!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; 
      } 
     } 
    ?> 

Bất kỳ trợ giúp đều được chào đón. Tôi cảm thấy như thế này có thể là một người khá phổ biến với những người cố gắng để thực hiện nó vào các hình thức làm việc hiện tại của họ.

+0

FWIW, tôi bị bỏ rơi Google lại mã xác nhận ủng hộ một giải pháp tùy chỉnh hình ảnh xác thực được xây dựng vào khuôn khổ của tôi. Vì lý do gì đó, tôi không thể tải tiện ích hiển thị một cách đáng tin cậy trong tất cả các trình duyệt. – Sparky

Trả lời

5

Kiểm tra liên kết này: https://developers.google.com/recaptcha/docs/verify

Trong một vài từ, bạn nên thực hiện theo yêu cầu để

https://www.google.com/recaptcha/api/siteverify?secret=YOUR_SECRET&response=RESPONSE_CAME_FROM_YOUR_FORM&remoteip=USER_IP_ADDRESS 

đâu YOUR_SECRET là chìa khóa bí mật mà bạn nhận được trên trang web ReCAPTCHA, USER_IP_ADDRESS có thể nhận được thông qua $_SERVER mảng và RESPONSE_CAME_FROM_YOUR_FORM là một chuỗi được gửi cùng với biểu mẫu của bạn. Nó được lưu trữ trong $_POST['g-recaptcha-response'].

Bạn có thể làm điều đó thông qua file_get_contents($url) như

$data = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR_SECRET&response=RESPONSE_CAME_FROM_YOUR_FORM&remoteip=USER_IP_ADDRESS"); 

Trong $data bạn sẽ nhận được đối tượng JSON chứa success lĩnh vực mà bạn đang tìm kiếm. Nếu thành công là sai, thì nó không phải là một con người và bạn nên exit(). Tôi đề nghị bạn kiểm tra điều này trong phần đầu của chương trình của bạn.

Cập nhật:

giải mã của JSON đối tượng trông giống như:

$data = json_decode($data); // This will decode JSON to object 
if(!$data->success) 
    exit(); 

Cập nhật:

Đôi khi, file_get_contents($url) sẽ không thể thiết lập kết nối https bảo đảm. Thay vào đó bạn có thể sử dụng open_https_url($url) Làm cho mã cái nhìn của bạn như:

<?php 
    $your_secret = "<secret_key_you_received_from_recaptcha_site>"; 
    $client_captcha_response = $_POST['g-recaptcha-response']; 
    $user_ip = $_SERVER['REMOTE_ADDR']; 

    $captcha_verify = open_https_url("https://www.google.com/recaptcha/api/siteverify?secret=$your_secret&response=$client_captcha_response&remoteip=$user_ip"); 
    $captcha_verify_decoded = json_decode($captcha_verify); 
    if(!$captcha_verify_decoded->success) 
     die('DIRTY ROBOT'); 

    $name = $_POST['name']; 
    $email = $_POST['email']; 
    $message = $_POST['message']; 
    $human = $_POST['human']; 
    $from = 'From: My Website'; 
    $to = '[email protected]'; 
    $subject = 'Request Form'; 

    $body = "Name: $name \n E-Mail: $email \nMessage:\n$message"; 

    if ($_POST['submit']) { 
     if ($email != '') { 
      if ($human == '4') {     
       if (mail ($to, $subject, $body, $from)) { 
        echo '<p>You have successfully submitted your information to PS4RS. Subscribers to our mailing list will begin to periodically receive updates.</p>'; 
       } else { 
        echo '<p>Something went wrong, go back and try again!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; 
       } 
      } else if ($_POST['submit'] && $human != '4') { 
       echo '<p>You answered the anti-spam question incorrectly!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; 
      } 
     } else { 
      echo '<p>You need to fill in all required fields!!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; 
     } 
    } 
?> 
+0

Vâng, tôi chắc chắn đã xem xét trang web đó và có vẻ như tôi cần một chút kiến ​​thức mã hóa để có được khái niệm về nó. Bạn đã giải thích nó rất tốt. Tìm hiểu cách sửa đổi trang bài đăng của tôi và vị trí để đặt trong mã đó, là phần phức tạp mà tôi gặp phải sự cố. –

+0

Tôi đã thêm một số bản sửa lỗi và mã mẫu. Hy vọng bây giờ bạn sẽ được ok =) – Alagunto

1

Có lẽ câu trả lời ở trên là một chút lỗi thời, kể từ khi Google hiện đang sử dụng reCaptcha nocaptcha. Tôi tìm thấy một câu trả lời đơn giản và đầy đủ hơn ở đây để sử dụng với tệp email php riêng biệt của bạn.

Giải pháp có một mẫu email đơn giản với tên và email và một tệp php riêng để gửi biểu mẫu. Bạn sẽ có thể tiếp tục từ đó và chỉnh sửa biểu mẫu của bạn cho phù hợp. Các giải pháp làm việc cho tôi.

https://stackoverflow.com/a/27439796/3934886

và liên kết để hướng dẫn:

http://codeforgeek.com/2014/12/google-recaptcha-tutorial/

+1

Hi alex, vì nó đứng đó là một liên kết chỉ trả lời và có khả năng bị xóa. Nếu bạn thấy chắc chắn các bản sao hãy gắn cờ như vậy. Nếu bạn muốn cung cấp câu trả lời, hãy đặt câu trả lời ở chế độ độc lập, giữ liên kết dưới dạng tham chiếu. – bummi

+0

Tôi không thể biết đó có phải là bản sao hay không. Đôi khi câu hỏi được xác định rất tồi tệ, nó có thể có nhiều câu trả lời. Dù sao, tôi mạnh mẽ chuyên nghiệp loại bỏ các bản sao nhưng tôi không chắc chắn về hiệu quả của hệ thống gắn cờ. Khi chỉ người điều tra đi đúng hướng cũng có thể hữu ích. – alex351

+0

Tôi cũng không thể (thiếu kiến ​​thức miền), bạn có thể thêm liên kết, nhưng chỉ các câu trả lời liên kết thường bị xóa, trong trường hợp này, hãy thêm tóm tắt liên kết đầu tiên bạn cung cấp. – bummi

Các vấn đề liên quan