reCAPTCHA'yı FormMail ile kullanma

Önemli: reCAPTCHA API'nin 1.0 sürümü artık desteklenmiyor, lütfen 2.0 sürümüne yükseltin. Daha fazla bilgi

Burada, reCAPTCHA Perl Modülü'nü kullanmadan FormMail komut dosyanıza nasıl reCAPTCHA ekleyeceğiniz açıklanmaktadır. Ne yaptığınızı biliyorsanız, alternatif olarak reCAPTCHA Perl Modülü'nü de kullanabilirsiniz.

İstemci Tarafı (CAPTCHA resminin görünmesini sağlama)

HTML sayfanızda <form> öğesinin içine aşağıdaki kodu eklemeniz gerekir:

  <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>

Büyük olasılıkla söylemeye gerek yok, ama yine de söyleyelim: your_public_key iki örneğini, hesap oluşturma işlemi sırasında aldığınız ortak anahtarla değiştirmeniz gerekir. Özel anahtarınızı yanlışlıkla kullanmamaya dikkat edin.

Bu işlem, temel olarak bir POST isteği üzerinden formmail.cgi'ye (veya FormMail.pl) aktarılan iki parametreyi ekler:

  • recaptcha_challenge_field: Bu, ortak anahtarınız aracılığıyla oluşturulan yarışmadır.
  • recaptcha_response_field: Bu, yukarıdaki sorgulama için kullanıcı tarafından gönderilen yanıttır.
  • Sunucu Tarafı (Kullanıcının doğru yanıtı girip girmediğini test etme)

    Ardından, iki parametreyi işlemek ve reCAPTCHA sunucularından doğrulama işlemini doğrulamak için formmail.cgi'yi (veya FormMail.pl) değiştirmeniz gerekir. Bu noktada, her ihtimale karşı FormMail.pl dosyanızın yedek bir kopyasını oluşturmanız iyi bir fikir olabilir. Aşağıdaki kodda, "+" satırın FormMail komut dosyasına eklenmesi gerektiği, "-" ise satırın bundan kaldırılması gerektiği anlamına gelir. Her durumda, FormMail komut dosyasında bitişik satırları göstererek satırların nereye eklenmesi veya kaldırılması gerektiğini gösteririz.

    Öncelikle, FormMail'e aşağıdaki satırı ekleyerek Perl'e LWP::UserAgent modülünü kullanmasını bildirmeniz gerekir:

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

    (Bu, LWP::UserAgent modülünün Perl ortamınızda olmasını gerektirir. Perl'in çoğu yüklemesinde bu modül zaten vardır. Modül yüklü değilse Perl modüllerini yüklemeyle ilgili bazı temel talimatları burada bulabilirsiniz.)

    Ardından, aşağıda tanımlanan CAPTCHA kontrolü işlevini çağırmak için gereken kodu ekleyin.

     # 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;
    

    Şimdi, CAPTCHA yanıtını doğrulayın ve yanıt, soruyla eşleşmiyorsa bir hata oluşturun.

     +##############################################################################
     +# 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.                                                   #
    

    Son olarak, kontrolün başarısız olması durumunda hata mesajını yazdıran işlevi oluşturun:

             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;
     }
    

    Hepsi bu kadar! reCAPTCHA artık sitenizde çalışıyor olmalı.

    Ek Okumalar

  • Görünüm ve Tarzı Özelleştirme
  • İpuçları ve Kurallar
  • Sorun giderme