Menggunakan reCAPTCHA dengan FormMail

Penting: reCAPTCHA API versi 1.0 tidak lagi didukung, upgrade ke Versi 2.0. Pelajari lebih lanjut

Di sini kami akan menjelaskan cara menambahkan reCAPTCHA ke skrip FormMail tanpa menggunakan Modul reCAPTCHA Perl. Jika tahu apa yang Anda lakukan, Anda dapat menggunakan Modul Perl reCAPTCHA.

Sisi Klien (Cara memunculkan gambar CAPTCHA)

Di halaman HTML, di dalam elemen <form>, Anda harus menambahkan kode berikut:

  <script type="text/javascript"
    src="http://www.google.com/recaptcha/api/challenge?k=your_public_key">
  </script>
  <noscript>
    <iframe src="http://www.google.com/recaptcha/api/noscript?k=your_public_key"
        height="300" width="500" frameborder="0"></iframe>

    <textarea name="recaptcha_challenge_field" rows="3" cols="40">
    </textarea>
    <input type="hidden" name="recaptcha_response_field"
        value="manual_challenge">
  </noscript>

Ini mungkin tidak perlu dikatakan lagi, tetapi kami akan tetap mengatakannya: Anda harus mengganti dua instance your_public_key dengan kunci publik yang Anda terima selama proses pembuatan akun. Berhati-hatilah agar Anda tidak menggunakan kunci pribadi secara tidak sengaja.

Pada dasarnya, tindakan ini akan menambahkan dua parameter yang diteruskan ke formmail.cgi (atau FormMail.pl) melalui permintaan POST, yaitu:

  • recaptcha_challenge_field: Ini adalah tantangan yang dibuat melalui kunci publik Anda.
  • recaptcha_response_field: Ini adalah respons yang dikirimkan pengguna terhadap tantangan di atas.
  • Sisi Server (Cara menguji apakah pengguna memasukkan jawaban yang benar)

    Selanjutnya, Anda perlu memodifikasi formmail.cgi (atau FormMail.pl) untuk menangani kedua parameter tersebut dan memvalidasi tantangan dari server reCAPTCHA. Untuk saat ini, sebaiknya buat salinan cadangan FormMail.pl Anda, untuk berjaga-jaga. Pada kode di bawah, "+" berarti baris perlu ditambahkan ke skrip FormMail, dan "-" berarti baris harus dihapus dari sana. Dalam setiap kasus, kami menunjukkan tempat baris perlu ditambahkan atau dihapus dengan menampilkan baris yang berdekatan dalam skrip FormMail.

    Pertama, Anda harus memberi tahu Perl untuk menggunakan modul LWP::UserAgent dengan menambahkan baris berikut ke FormMail:

     # ACCESS CONTROL FIX: Peter D. Thompson Yezek                                #
     #                     http://www.securityfocus.com/archive/1/62033           #
     ##############################################################################
     +use LWP::UserAgent;
     +
    

    (Ini akan mengharuskan modul LWP::UserAgent berada di lingkungan Perl Anda. Sebagian besar instalasi Perl sudah memiliki modul ini. Jika modul tidak terinstal, berikut beberapa petunjuk dasar cara menginstal modul Perl.)

    Kemudian, tambahkan kode untuk memanggil fungsi pemeriksaan CAPTCHA yang ditentukan di bawah.

     # Check Required Fields
     &check_required;
    
     +# Check the captcha challenge and response.
     +&check_captcha;
     +
     # Send E-Mail
     &send_mail;
    
     # Return HTML Page or Redirect User
     &return_html;
    

    Sekarang, validasikan respons CAPTCHA dan buat error jika respons tidak cocok dengan tantangan.

     +##############################################################################
     +# Check the CAPTCHA response via the reCAPTCHA service.
     +sub check_captcha {
     +
     +      my $ua = LWP::UserAgent->new();
     +      my $result=$ua->post(
     +      'https://www.google.com/recaptcha/api/verify',
     +      {
     +          privatekey => 'your_private_key',
     +          remoteip   => $ENV{'REMOTE_ADDR'},
     +          challenge  => $Form{'recaptcha_challenge_field'},
     +          response   => $Form{'recaptcha_response_field'}
     +      });
     +
     +      if ( $result->is_success && $result->content =~ /^true/) {
     +              return;
     +      } else {
     +              &error('captcha_failed');
     +      }
     +}
     +
     # NOTE rev1.91: This function is no longer intended to stop abuse, that      #
     #    functionality is now embedded in the checks made on @recipients and the #
     #    recipient form field.                                                   #
    

    Terakhir, buat fungsi yang akan mencetak pesan error jika pemeriksaan gagal:

             if ($Config{'missing_fields_redirect'}) {
                 print "Location: " . &clean_html($Config{'missing_fields_redirect'}) . "\n\n";
             }
     +    }
     +    elsif ($error eq 'captcha_failed') {
     +            print <<"(END ERROR HTML)";
     +Content-type: text/html
     +
     +<html>
     + <head>
     +  <title>Error: Captcha Check Failed</title>
     + </head>
     + <body bgcolor=#FFFFFF text=#000000>
     + <center>
     +  <table border=0 width=600 bgcolor=#9C9C9C>
     +    <tr><th><font size=+2>Error: Captcha Check Failed</font></th></tr%gt;
     +   </table>
     +  <table border=0 width=600 bgcolor=#CFCFCF>
     +    <tr><td>The Captcha response of the form you submitted did not match the challenge.
     +     Please check the form and make sure that your response matches the challenge in the captcha image.
     +     You can use the browser back button to return to the form.
     +     </center%gt;
     +    </td></tr>
     +   </table>
     +  </center>
     + </body>
     +</html>
     +(END ERROR HTML)
     +    }
             else {
                  foreach $missing_field (@error_fields) {
                      $missing_field_list .= "<li>" . &clean_html($missing_field) . "\n";
     .
     .
     .
      </html>
     (END ERROR HTML)
             }
     -    }
     -
         exit;
     }
    

    Selesai! reCAPTCHA seharusnya kini berfungsi di situs Anda.

    Bacaan Lebih Lanjut

  • Menyesuaikan Tampilan dan Nuansa
  • Tips dan Panduan
  • Pemecahan masalah