중요: 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 요청을 통해 이를 전달할 수 있습니다.
서버 측 (사용자가 올바른 답변을 입력했는지 테스트하는 방법)
다음으로 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가 작동할 것입니다.