استخدام 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 على موقعك الإلكتروني.

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

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