FormMail에 reCAPTCHA 사용

중요: reCAPTCHA API 버전 1.0은 더 이상 지원되지 않습니다. 버전 2.0으로 업그레이드하세요. 자세히 알아보기

여기서는 reCAPTCHA Perl 모듈입니다. 무엇을 하고 있는지 알고 있다면 reCAPTCHA를 대신 사용할 수 있습니다. Perl 모듈입니다.

클라이언트 측 (보안문자 이미지를 표시하는 방법)

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 스크립트에서 인접한 줄을 표시하여 줄을 추가하거나 삭제해야 하는 위치를 보여줍니다.

    먼저 다음 행을 추가하여 LWP::UserAgent 모듈을 사용하도록 Perl에 알려야 합니다. FormMail:

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

    (이 기능을 사용하려면 LWP::UserAgent 모듈이 필요합니다. 사용할 수 있습니다 대부분의 Perl 설치에는 이미 이 모듈이 있습니다. 만일 모듈이 설치되지 않은 경우, 다음은 Perl 설치에 대한 몇 가지 기본 안내입니다. 모듈을 참조하세요.

    그런 다음 아래에 정의된 보안문자 확인 기능을 호출하는 코드를 추가합니다.

     # 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가 작동할 것입니다.

    추가 자료

  • 디자인 맞춤설정
  • 도움말 및 가이드라인
  • 문제 해결