Informática Numaboa - Tutoriais e Programação

Perl+CGI - Um script de verdade

Ter

18

Nov

2008


19:46

  • Imprimir
(4 votos, média 4.00 de 5) 


Neste módulo do tutorial Perl+CGI vou mostrar como criar um script que permite que visitantes façam contato com o webmaster do site. Vou tentar dissecar este exemplo o máximo possível. Se eu exagerar nos detalhes, me perdoem - é que o foco é o iniciante em Perl+CGI, assim como também fui um dia :smile:

Como começar

Sempre é bom fazer um planejamento prévio do script que se deseja produzir. É mais fácil trabalhar quando os objetivos e a "mecânica" estão claramente definidos. Pessoalmente, considero como estrutura de scripts os seguintes tópicos:

  1. Função do script
  2. Linguagem utilizada
  3. Fluxograma
  4. Cabeçalho com identificação, versão, autoria, histórico e observações
  5. Variáveis configuráveis pelo usuário
  6. Variáveis do script
  7. Rotinas do script, do tipo fluxograma A, fluxograma B, etc
  8. Subrotinas que executem funções específicas ou repetitivas, como checagem de parâmetros

1. A função deste script

A função deste script de exemplo é possibilitar ao internauta o ENVIO DE UM EMAIL a um ENDEREÇO ESPECIFICADO (no caso o webmaster do site) diretamente ATRAVÉS DA INTERNET.

2. A linguagem utilizada

A linguagem utilizada será PERL, portanto é aconselhável ter acesso a um manual desta linguagem para poder efetuar consultas.

A Aldeia oferece um tutorial de Perl que talvez possa ajudá-lo (nesta mesma seção procure pelo tutorial Perl).

3. Fluxogramas

Este script possui dois fluxogramas. No primeiro, um link de alguma página aciona o CGI. O script começa a ser executado na seguinte sequência:

  • localiza o interpretador Perl no servidor
  • estabelece as variáveis configuráveis
  • estabelece as variáveis do script
  • identifica o método de chamada (através de um link é um GET)
  • fraciona as variáveis e os respectivos valores da query do GET
  • produz uma página HTML com os campos de entrada (nome e email do usuário, comentários) e botão de "enviar" (formulário)
  • encerra o script

O segundo fluxograma entra em ação quando o usuário fizer uso do formulário gerado pelo primeiro fluxograma, ou seja, quando preencher corretamente os campos e acionar o botão "enviar". Neste caso, o CGI é novamente acionado e o script segue uma nova sequência:

  • localiza o interpretador Perl no servidor
  • estabelece as variáveis configuráveis
  • estabelece as variáveis do script
  • identifica o método de chamada (através do formulário é um POST)
  • fraciona as variáveis e os respectivos valores do POST do formulário
  • checa se os campos foram preenchidos corretamente
    • se NÃO, refaz o formulário indicando o ponto do erro
    • encerra o script
  • se SIM, envia um email ao webmaster contendo os dados do formulário
  • envia um email agradecendo o usuário, confirmando o contato e o conteúdo da mensagem
  • produz uma página HTML agradecendo o contato
  • encerra o script

Não se preocupe se inicialmente as coisas parecem um tanto confusas. Cada uma das etapas dos fluxogramas será abordada com maiores detalhes logo adiante.


A primeira linha do script e a sua importância

Como já foi dito anteriormente nas dicas de programação, a primeira linha de todo script CGI deve ser iniciada com os caracteres #! (grade - ponto de exclamação), seguidos pelo caminho do diretório onde se encontra o interpretador Perl no servidor.

#!/usr/local/bin/perl

A rotina principal

Seguindo o esquema descrito logo no início, temos:

O cabeçalho

O cabeçalho contém apenas linhas de comentário que serão ignoradas pelo interpretador Perl. As linhas de contém o NOME do script, sua VERSÃO, o AUTOR, a DATA e observações consideradas importantes. Costuma-se também adicionar o histórico das versões e, eventualmente, indicações de como instalar o script no servidor.

######################################################################### # # contato.cgi - versão 1.0 # by vickisoft 1999 - webmaster arroba numaboa ponto com # # Uma referência ou um link para este tutorial # será muito apreciado (e fará um bem danado ao meu ego ;-) # # Chamar script com: # # #################### # Variáveis configuráveis # #################### # endereços de email $masterEmail = "webmaster\@numaboa.com"; # Imagens nas páginas dinâmicas $imgLogo = "suaLogo.gif"; $imgFundo = "seuFundo.jpg"; # Referências da URL da Home Page $urlHP = "http://www.numaboa.com";

As linhas em branco são ignoradas pelo interpretador Perl. Portanto, para obter um script "arrumado", de visual agradável e mais adequado para receber futuras manutenções e melhorias, não economize linhas em branco e linhas de comentário bem destacadas.

Este bloco de variáveis configuráveis está logo no início do script para facilitar o trabalho do usuário. Nele se encontram algumas variáveis que serão utilizadas quando o script for executado. O escopo dessas variáveis é global, pois foram definidas no corpo principal do script. Isto significa que qualquer subrotina ou função tem acesso direto a essas variáveis.

Todas as variáveis deste bloco são variáveis simples (escalares).

A variável $masterEmail contém uma string com o endereço de email para o qual deverá ser enviada a mensagem do usuário. Note que a arroba (@) é precedida por uma barra invertida (\). Essa notação é necessária para que a arroba não seja interpretada como um caractere especial.

As variáveis restantes também são do tipo string e seguem as regras normais de notação, ou seja, $nomeDaVariável="valor da variável";. Não se esqueça de iniciar o nome com o caractere $ e de terminar a atribuição com um caractere ;. Um erro muito comum é esquecer o famigerado ponto-e-vírgula que, por ser pequeno, costuma ser difícil de achar...

As variáveis $imgLogo e $imgFundo contém o nome dos arquivos que contém as imagens da logo e do fundo de página que serão incorporadas ao código HTML das páginas de formulário e de agradecimento. Caso se encontrem num diretório diferente do diretório do script, este precisa preceder o nome do gráfico ($imgLogo="/imagens/suaLogo.gif";)

A variável $urlHP indica o endereço URL da sua Home Page (não o caminho relativo) e será utilizada para produzir um link no email de agradecimento.

As variáveis do script

# ########### # Variáveis do script # ########### $programaMail = "/usr/lib/sendmail -t";

Apenas uma variável foi definida neste bloco, a $programaMail, que contém o caminho do serviço de email disponibilizado pelo seu provedor de serviços (servidor). Caso você desconheça o caminho, solicite a informação ao seu provedor. Geralmente os mailers são configurados em /usr/lib/sendmail, /usr/bin/sendmail ou /usr/sbin/sendmail. O parâmetro -t refere-se ao programa sendmail.


A rotina principal do script

# ############################# # Script # ############################# &pegaInput; $topico = $campo{'topico'}; $topico =~ s/%20/ /g; if ($ENV{'REQUEST_METHOD'} eq 'GET') { &fazMaster(); } if ($ENV{'REQUEST_METHOD'} eq 'POST') { &mandaMaster; }

Identificando e depurando os parâmetros recebidos

Quando o script é acionado recebendo parâmetros deve-se SEMPRE OBSERVAR MEDIDAS DE SEGURANÇA para que o processamento de parâmetros viciados seja impedido. Para evitar que comandos ou fragmentos de código sejam transferidos ao nosso script por pessoas mal intencionadas (os crackers), utilizamo-nos das expressões regulares. Estas farão as substituições necessárias "limpando" os parâmetros que serão utilizados no processamento.

A criação de uma subrotina específica para este procedimento não é necessária, porém facilita manutenções posteriores além de deixar o texto mais claro.

A subrotina criada para tal fim foi denominada pegaInput e é chamada logo no começo do script através de &pegaInput.

sub pegaInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$buf,$ENV{'CONTENT_LENGTH'}); } else { $buf=$ENV{'QUERY_STRING'}; } if ($buf eq "") { return 0 ; } else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval) { ($nome,$valor)=split(/=/,$fval[$i],2); $valor =~ tr/+/ /; $valor =~ s/%(..)/pack("c",hex($1))/ge; $valor =~ s/
mfx brokerчугунная сковорода гриль с крышкой прессомработа полигон ноутбук асерполиклиника 14 харьковЛимтеклобановский депутат