Início > FAQ > On the Fly – O Que É?

On the Fly – O Que É?

On the fly é uma expressão em inglês que têm como significado os termos: dinâmicamente, às pressas, sempre mudando.

Em termos de programação, o On-the-fly significa algo criado, ou modificado dinâmicamente somente quando requisitamos.

Um exemplo de sistema on-the-fly é o validador de códigos em imagem.

Este tipo de validador, gera uma imagem diferente a cada atualização da página. É imprevisível quantas imagens um usuário poderá necessitar até que este entre com um código correto, por isso não faz sentido armazená-las, pois caso contrário, em um grande site, isto facilmente poderia causar uma sobrecarga.

Mas o On-the-fly resolve esta questão! Uma vez que a imagem fora criada, esta permanesse apenas no cache do usuário. Caso este venha a atualizar a página, uma nova imagem é gerada.

Veja funcionando:

[ Validador On-the-Fly


 

Veja o Código Completo:
(validador.cgi)

 #!/usr/bin/perl
use CGI;
use CGI::Carp “fatalsToBrowser”;
use Image::Magick;
###########################################################

$format = “jpeg”; # Formato de saída

$qs = $ENV{QUERY_STRING}; # Pegamos a querystring

## Lemos o buffer
read(STDIN, $buffer, $ENV{‘CONTENT_LENGTH’});
@conteudo2 = split(/&/, $ENV{QUERY_STRING});
foreach $par (@conteudo2) {
        ($campo, $valor) = split(/=/, $par);
        $valor =~ tr/+/ /;
        $valor =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”, hex($1))/eg;
        $QUERY{$campo} = $valor;
}

$cgi=new CGI( ); # Criamos uma instância em CGI

if (!$ENV{QUERY_STRING}){ # Se não há querystring
   &addcookie; # Gera novo cookie
   &form; # Mostra formulário
}elsif($QUERY{cod}){ # Se há querystring
  if ($cgi->cookie(‘codigo’) eq $QUERY{cod}){
   # Se o código digitado corresponde ao código no cookie
   &addcookie; # Gera novo cookie 
   # Se corresponde, mostra correto
   print  “<font color=green><h3>Código correto!</h3></font>”; 
   &form; # Mostra formulário
  }else{  # Senão
   &addcookie; # Gera novo cookie
   print  “<font color=red><h3>Código errado!</h3></font>”; # Mostra errado
   &form; # Mostra formulário
  }

}elsif($QUERY{gerar}){ # Se mandou gerar….

  $rand=$cgi->cookie(‘codigo’); # Pega o numero que irá mostrar
  $novo  = Image::Magick-> new(size=>’100×65′);
  # Cria imagem com as dimensões desejadas
  $imagem = $novo-> Read(‘gradient:#CCCCCC-#EEEEEE’);
  # Lê a imagem e coloca-a em uma variável com um fundo degradê
  $imagem=$novo-> Raise(‘4×4’); # Adiciona um efeito de relevo
  $imagem=$novo->MotionBlur(angle=>60,radius=>8,sigma=>3);
  # Adiciona um efeito de borrar
  $imagem=$novo-> Annotate( font => ‘/home/www/HATTEN.ttf’,# Caminho para fonte
fill        => ‘black’,             # Cor da fonte
                                                 pointsize  => 20,               # Tamanho da fonte
                                                 gravity      => ‘Center’,       # Alinhamento
                                                 text          => $rand,          # Escreve o número
  );

  print “Content-type:image/$format\n\n”;
  # Imprime o cabeçalho com o devido formato
  binmode STDOUT;                                 
  # Converte a saída para binario

  $imagem=$novo->Write( “$format:-” );
  # Mostra a imagem no formato escolhido

}

sub form{
 # Mostra na tela
 print qq|<p>Digite o código:</p>
 <img src=?gerar=num />
 <form method=’get’>
  <input type=text name=’cod’ size=8>
  <input type=submit value=’ok’>
 </form>
 |;
}

sub addcookie{
   $codigo=int rand(100000); # Pega um número qualquer
   $cookie=$cgi->cookie(-name=>’codigo’, # Novo cookie
  -value=>$codigo,                    
  -expires=>’+1m’,                     # Expira em 1 minuto
  -path=>’/’,
   ); 
   print $cgi->header(-cookie=>$cookie);  # Salvamos o cookie
}

  1. Fernando
    8 agosto, 2008 às 9:41 am

    Legal amigo! muito boa explanação ao termo “on-the-fly”.
    Mas cadê o código que gera a imagem através do image-magick?

  2. 16 agosto, 2008 às 1:21 am

    Muito bom exemplo Whitsnake….🙂

  3. Sérgio
    23 novembro, 2008 às 11:43 am

    Primeiramente parabenizo pelo seu blog. Conheci ele agora e achei os assuntos muito bem selecionados e explicados.
    Amigo, muitas vezes utilizam captcha para verificar se realmente é um humano que está acessando. Assim um programa-mal-intencionado “não pode” ler a imagem gerada. Porem dessa forma que você explicou, uma pessoa mal intencionada consegue tranquilamente saber qual é o código simplesmente verificando o cookie. Isso não fica seguro… estou certo?

  4. 23 novembro, 2008 às 2:13 pm

    Olá Sérgio, primeiramente gostaria de dizer muito obrigado!

    Sobre sua observação, você tem razão sim!
    Um usuário mal-intencionado pode acessar seus cookies e então burlar o sistema.
    Porém, vamos lembrar de que o objetivo do Captcha é identificar se o usuário é humano ou não, correto?
    Então se ele faz todos estes esquemas para “burlar” o sistema, ele só estaria então confirmando que este é um usuário humano (bem malandro mais é)…. entende? Ou seja, o objetivo em si foi alcançado.

    Porém, este não é o tipo de verificação que faríamos num sistema de senha, por exemplo… aí sim seu comentário entra em pauta.

    Eu fiz um artigo sobre Sistemas de Autenticação por Cookie, este pode ser encarado bem mais seguro, pois a senha não é passada por cookie antes de ser confirmada.

    Em breve teremos novos artigos, não deixe de nos visitar, ok?

    Abraços!

  5. Sérgio
    23 novembro, 2008 às 2:32 pm

    Amigo, então por questão de segurança, quer dizer que vale mais a pena eu salvar a imagem no servidor, assim o cara mal-intencionado não consegue burlar o sistema pra saber qual foi o captcha criado. Mas pô, deve haver uma maneira de fazer (client-side), que não tenha como saber qual o código do captcha. Há?

  6. 23 novembro, 2008 às 3:11 pm

    Olá Sérgio,

    Creio que por client-side esta é a única alternativa, o que talvez você pode fazer é criptografar este código q for passado pelo cookie com o MD5, por exemplo.

    É apenas uma sugestão.

    Mas, se você realmente deseja tornar o Captcha “imburlável” podemos utilizar dos Sessions!
    O CGI Session pode ser comparado à um cookie, porém este é server-side, mas é talvez a melhor alternativa se você não deseja salvar todas as imagens do Captcha.

    Infelizmente ainda não temos nenhum exemplo, mas posso planejar como próximo artigo algo que fale mais sobre o CGI Sessions.

    Abraços!

  7. Sérgio
    24 novembro, 2008 às 7:32 am

    Amigo, muito obrigado pela atenção dispensada.
    Realmente não tinha pensado em usar o Digest-MD5. Já é um boa opção!

    Minha última dúvida: Poderia me explicar o por que daquela parte “lemos o buffer”?
    As variáves ali utilizadas, não são, em nenhum momento, utilizadas no resto do programa…

    Abraço

  8. Whitesnake
    15 fevereiro, 2009 às 3:05 pm

    Olá Sérgio, o motivo de “ler o buffer” é que precisamos saber quando o usuário acessa a QueryString “gerar”.

    Com aquela parte de ler o buffer, podemos pegar essa query com a variável $QUERY{gerar}.

    Esta foi a única utilidade daquela função.

    Talvez tivesse sido mais fácil usar o módulo CGI…. CGI->param(“gerar”)

    É que eu evito ao máximo usar módulos porque não é todo servidor que tem eles instalados.

  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: