Resolução do Exercício 4 de GOII

 

a)

<HTML>
<HEAD>
<TITLE>Poluicao no rio Pulmão</TITLE>
</HEAD>
<BODY>
<H1>A poluição do Rio Pulmão</H1>
<P>
 <TABLE border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%">
  <TR>
   <TD width="200" valign="top"><IMG border="0" src="poluicao1.jpg" width="200" height="127">
   </TD>
   <TD valign="top"> A poluição do Rio Pulmão é um
 facto que nos atinge a todos.
<P>Assine esta petição!</P>
<form method="POST" action="http://gnomo.fe.up.pt/~fsilva/htbin/input.pl">
     <TABLE>
      <TR>
       <TD><B>Nome:</B>
       </TD>
       <TD>        
        <INPUT type="text" size="49" name="nome">
       </TD>
      </TR>
      <TR>
       <TD><B>BI:</B>
       </TD>
       <TD>        
        <INPUT type="text" size="8" maxleght="8" name="bi">
       </TD>
      </TR>
      <TR>
       <TD valign="top"><B>Mensagem:</B>
       </TD>
       <TD>
        <TEXTAREA columns="20" rows="10" cols="41" name="mesg"></TEXTAREA>
       </TD>
      </TR>
     </TABLE>
<P></P>
    <CENTER>
<P>     
     <INPUT type="submit" value="Submeter">     
     <INPUT type="reset" value="Limpar"></P></CENTER>
    </FORM>
   </TD>
  </TR>
 </TABLE>
Contacto por <a href="mailto:Filipe.Silva@fe.up.pt?subject=Peticao rio Pulmao">email</a>
</BODY>
</HTML>

ver Resultado

b)

É utilizado o método POST pois este método possibilita duas vantagens em relação ao método GET: a encriptação de dados e consideramos que a encriptação do numero de BI é necessária por ser um dado pessoal; e a possibilidade dos "campos" de entrada do form terem valores ilimitados, o que pode ser útil para o campo de mensagem.

c)

Poder-se-ia usar o numero de BI para verificar se uma pessoa já tinha assinado a petição. Para isso no programa que é executado pelo formulário seria verificado se já existia uma entrada com esse numero, dando assim uma mensagem de erro. Isso poderia ser feito usando um comando tipo grep para um ficheiro ou no caso de uma base de dados o BI poderia ser o campo de chave (único). A verificação usando o "check-digit" do BI evitaria em pouco a invenção de números.
Também se poderia usar um método de password dado por um organismo oficial e enviado para o endereço da pessoa.

d)

#!/usr/bin/perl

# Arranjar qual o método de entrada usado.

$method = $ENV{'REQUEST_METHOD'};


if ( $method eq 'POST' ) {

# Metodo de POST envia os dados por standard input

read(STDIN, $entrada, $ENV{'CONTENT_LENGTH'});

}
elsif ( $method eq 'GET' ) {

# Metodo GET significa que os dados veem do Form
# via variaveis de ambiente

$entrada = $ENV{'QUERY_STRING'};
}
else {
print "Content-type: text/html\n\n";
print "Método não tratado: $method";
exit (1);
}

# corte pelo simbolo de I comercial

foreach $_ (split(/&/,$entrada)) {

# A string está codificada com + em vez de espacos
# e os carateres especias com codigos hexadecimais %xx


# Converter os simbolos de + (mais) em espacos
$_ =~ s/\+/\ /g;

# divisao chave , valor pelo primeiro =
($key, $val) = split(/=/,$_,2);

# Conversao de %XX de hexadecimal para alfanumérico dos carateres especiais

$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%(..)/pack("c",hex($1))/ge;

# Associa chave a valor
$in{$key} .= "\0" if (defined($in{$key}));
$in{$key} .= $val;
}


# faco a gravacao em file dos dados...nao verifico se o BI 'e repetido
# NOTA:não é feita a a analise se o BI 'e um numero válido


$FILE =("../mgi/goii4_peticao.htm");
open (FH,">>$FILE") || die "Nao consigo abrir $FILE : $!\n";
print FH $in{'bi'};
print FH " -- ";
print FH $in{'nome'};
print FH " -- ";
print FH $in{'mesg'};
print FH "<br>\n\n";
close FH;
 

# HTML

# escrevo o cabecado de dados em HTML


print "Content-type: text/html\n\n";

print "<h1>Obrigado pela sua assinatura!!!</h1>\n";


#print do method usado
print "O método usado pelo FORM foi: ";
print $method;
print "<br>\n";



#print variaveis de entrada do FORM

print "<p><b>Nome: </b> ";
print $in{'nome'};
print "<br>\n<b>BI:</b> ";
print $in{'bi'};
print "<br>\n<b>Mensagem:</b> ";
print $in{'mesg'};


print "<p><a href=\"http://www.fe.up.pt/~fsilva/mgi/goii4_peticao.htm\">Ver assinaturas</a>";

ver Resultado