Importante: a versão 1.0 da API reCAPTCHA não é mais compatível. Faça upgrade para a versão 2.0. Saiba mais
Aqui vamos explicar como adicionar o reCAPTCHA ao seu script FormMail sem usar o Módulo reCAPTCHA Perl. Se você souber o que está fazendo, poderá usar o reCAPTCHA Perl.
Lado do cliente (como fazer a imagem CAPTCHA aparecer)
Na sua página HTML, no elemento <form> você deve adicionar o seguinte código:
<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>
Talvez seja desnecessário dizer, mas vamos esclarecer mesmo assim: você precisa substituir as duas
instâncias de your_public_key
pela chave pública que você recebeu
durante o processo de criação da conta. Tenha cuidado para não usar seu
por engano.
Isso basicamente adicionará dois parâmetros, que são passados para formmail.cgi (ou FormMail.pl) por uma solicitação POST, ou seja:
No servidor (como testar se o usuário inseriu a resposta certa)
Em seguida, modifique o formmail.cgi (ou FormMail.pl) para processar os dois parâmetros e validar o desafio dos servidores do reCAPTCHA. Neste ponto, provavelmente é uma boa ideia faça uma cópia de backup do seu FormMail.pl, por precaução. No código abaixo, "+" significa que a linha precisa ser adicionado ao script do FormMail, e "-" significa que a linha precisa ser removida dela. Em todos os casos, mostramos onde as linhas precisam ser adicionadas ou removidas mostrando as linhas adjacentes no script FormMail.
Primeiro, você precisa instruir Perl a usar o módulo LWP::UserAgent adicionando a linha a seguir: para o FormMail:
# ACCESS CONTROL FIX: Peter D. Thompson Yezek # # http://www.securityfocus.com/archive/1/62033 # ############################################################################## +use LWP::UserAgent; +
Isso exige o módulo LWP::UserAgent no ambiente Perl. A maioria das instalações do Perl já tem esse módulo. Caso o módulo não está instalado, aqui estão algumas instruções básicas sobre a instalação do Perl módulos.
Em seguida, adicione o código para chamar a funcionalidade de verificação CAPTCHA definida abaixo.
# 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;
Agora, valide a resposta do CAPTCHA e gere um erro se a resposta não corresponder ao desafio.
+############################################################################## +# 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. #
Por fim, crie a funcionalidade que mostra a mensagem de erro caso a verificação falha:
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; }
É isso! O reCAPTCHA já deve estar funcionando no seu site.