استفاده از reCAPTCHA با FormMail

مهم : نسخه 1.0 reCAPTCHA API دیگر پشتیبانی نمی‌شود، لطفاً به نسخه 2.0 ارتقا دهید. بیشتر بدانید

در اینجا نحوه اضافه کردن reCAPTCHA به اسکریپت FormMail خود را بدون استفاده از ماژول reCAPTCHA Perl توضیح خواهیم داد. اگر می دانید چه کاری انجام می دهید، می توانید از ماژول reCAPTCHA Perl استفاده کنید.

سمت مشتری (نحوه نمایش تصویر CAPTCHA)

در صفحه HTML خود، داخل عنصر <form> باید کد زیر را اضافه کنید:

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

احتمالاً ناگفته نماند، اما ما به هر حال آن را خواهیم گفت: باید دو نمونه your_public_key را با کلید عمومی که در طی فرآیند ایجاد حساب دریافت کرده‌اید جایگزین کنید. مراقب باشید که به اشتباه از کلید خصوصی خود استفاده نکنید.

این اساساً دو پارامتر را اضافه می کند که از طریق یک درخواست POST به formmail.cgi (یا FormMail.pl) ارسال می شود، یعنی:

  • recaptcha_challenge_field : این چالشی است که از طریق کلید عمومی شما ایجاد می شود.
  • recaptcha_response_field : این پاسخی است که کاربر به چالش بالا ارسال کرده است.
  • سمت سرور (نحوه تست اینکه آیا کاربر پاسخ صحیح را وارد کرده است)

    در مرحله بعد، باید formmail.cgi (یا FormMail.pl) را تغییر دهید تا این دو پارامتر را کنترل کند و چالش را از سرورهای reCAPTCHA تأیید کند. در این مرحله، احتمالاً ایده خوبی است که یک نسخه پشتیبان از FormMail.pl خود تهیه کنید. در کد زیر، "+" به این معنی است که خط باید به اسکریپت FormMail اضافه شود و "-" به معنای حذف خط از آن است. در هر مورد، با نشان دادن خطوط مجاور در اسکریپت FormMail، نشان می‌دهیم که خطوط باید کجا اضافه یا حذف شوند.

    ابتدا باید به پرل بگویید از ماژول LWP::UserAgent با افزودن خط زیر به FormMail استفاده کند:

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

    (این کار مستلزم آن است که ماژول LWP::UserAgent در محیط پرل شما باشد. اکثر نصب های Perl از قبل این ماژول را دارند. در صورتی که ماژول نصب نشده باشد، در اینجا چند دستورالعمل اساسی در مورد نصب ماژول های Perl آورده شده است.)

    سپس، کدی را برای فراخوانی عملکرد بررسی CAPTCHA که در زیر تعریف شده است، اضافه کنید.

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

    اکنون، پاسخ CAPTCHA را تأیید کنید و اگر پاسخ با چالش مطابقت نداشت، خطا ایجاد کنید.

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

    در نهایت، عملکردی را ایجاد کنید که در صورت عدم موفقیت بررسی، پیام خطا را چاپ می کند:

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

    خودشه! اکنون reCAPTCHA باید روی سایت شما کار کند.

    بیشتر خواندن

  • سفارشی کردن ظاهر و احساس
  • نکات و رهنمودها
  • عیب یابی