استخدام 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 بالمفتاح العام الذي تم الحصول عليه أثناء عملية إنشاء الحساب. احرص على عدم استخدام مفتاحك الخاص عن طريق الخطأ.

سيؤدي هذا في الأساس إلى إضافة معلمتين، يتم تمريرهما إلى formmail.cgi (أو FormMail.pl) من خلال طلب POST، وهما:

  • recaptcha_challenge_field: هذا هو التحدي الذي يتم إنشاؤه من خلال مفتاحك العام.
  • recaptcha_response_field: هذا هو الردّ الذي يرسله المستخدم على الاختبار أعلاه.
  • من جهة الخادم (كيفية اختبار ما إذا كان المستخدم قد أدخل الإجابة الصحيحة)

    بعد ذلك، يجب تعديل formmail.cgi (أو FormMail.pl) للتعامل مع المعلمتَين والتحقّق من صحة الاختبار من خوادم reCAPTCHA. في هذه المرحلة، ربما يكون من الجيد عمل نسخة احتياطية من FormMail.pl، من باب الاحتياط. في التعليمة البرمجية أدناه، تعني "+" أنه يجب إضافة السطر إلى النص البرمجي FormMail، وتعني "-" أنه يجب إزالة السطر منه. في كل حالة، نعرض المكان الذي تحتاج فيه إلى إضافة الأسطر أو إزالتها من خلال إظهار الأسطر المجاورة في النص البرمجي FormMail.

    أولاً، يجب أن تطلب من Perl استخدام الوحدة النمطية LWP::UserAgent عن طريق إضافة السطر التالي إلى FormMail:

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

    (سيتطلب ذلك أن تكون الوحدة LWP::UserAgent في بيئة لغة Perl لديك. تحتوي معظم عمليات تثبيت 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 الآن على موقعك الإلكتروني.

    قراءات إضافية

  • تخصيص الشكل والمظهر
  • نصائح وإرشادات
  • تحديد المشاكل وحلّها