Revista Do Linux  
EDIÇÃO DO MÊS
  A Catedral e o Bazar
  A nova técnica dos Hackers
  Conexão inteligente
  Desvendando o Flagship
  Doutores em Linux
  Firewalls a partir do IP Masquerade
  Internet grátis, uai!
  Intranet - Benefícios que você nem conhece
  Linux World Expo
  Linux para macho
  Nos bastidores do Linux brasileiro
  Por um Linux fácil
  Rendering: virtualmente real
  Rádio Linux
  Servidor Linuxcom estações Windows
  Viagem ao centro do kernel
  vi, vim e venci

Desvendando o CGI com o Flagship

Através do FlagShip, que utiliza
linguagem igual à do Clipper,
é possível desenvolver os mais
diversos produtos para a Internet

Vamos falar um pouco sobre como colocar um site na Internet, interagindo com as suas bases de dados do FlagShip. Praticamente todos que têm acesso à Internet já visitaram algum site de procura ou um banco comercial, e em alguns deles puderam observar que o endereço é muito longo, como em: cgi.netscape.com/cgi-bin/rlc

CONTENT_LENGTH=3D232 Æ Quantidade de dados de formulário = contendo nome dos campos

CONTENT_TYPE=3Dapplication/x-www-form-urlencoded Æ O tipo de dad= o

DOCUMENT_ROOT=3D/home/httpd/html Æ Diretório raiz f&iacut= e;sico do domínio

HTTP_COOKIE=3DMEUCOOKIE=3DVALOR DO COOKIE Æ Todos os cookies par= a o endereço separados por ;

HTTP_PRAGMA=3Dno-cache Æ Se a página ficará arquiv= ada no cache do cliente

HTTP_REFERER=3D*http Æ //linux/cgi-bin/fsweb.cgi Æ De onde= veio a requisição, sites de procura etc..

HTTP_USER_AGENT=3DMozilla/4.7 [en] (Win98; U) Æ Nome do browser = do cliente,neste caso foi utilizado Netscape 4.7

QUERY_STRING=3Dvariable=3Djorge Æ Quais os dados que foram envia= dos pela linha de comando

REMOTE_ADDR=3D200.0.0.2 Æ IP do cliente

REQUEST_METHOD=3DPOST Æ Tipo de requisição

REQUEST_URI=3D/cgi-bin/fsweb.cgi?variable=3Djorge Æ Linha de com= ando sem o domínio e com as variáveis

SCRIPT_FILENAME=3D/home/httpd/cgi-bin/fsweb.cgi Æ Path completo = do CGI

SCRIPT_NAME=3D/cgi-bin/fsweb.cgi Æ Path a partir do diretó= ;rio raiz do domínio sem variáveis

SERVER_ADMIN=3Dwebmaster@somers.com.br Æ E-mail do administrador=

SERVER_NAME=3Dlinux.somers Æ Nome do servidor

SERVER_PORT=3D80 Æ Porta 80 =3D HTTP, 443 =3D HTTPS

gi.cgi?URL=3Dwww.somers.com.br. Nesse exemplo está

nítido que o servidor da Netscape está executando um pr= ograma que receberá o endereço www.somers.com.br. Já= no caso de bancos comerciais como o Itaú, poderemos ver um endere= ço como bankline.itau.com.br/GRIPNET/montTela.exe, e nesse caso &e= acute; nítido que o servidor do Itaú está executando= um programa externo ao servidor Web.

Esses dois exemplos escolhidos aleatoriamente têm

em comum apenas o fato de estarem executando um programa externo, mas = o método utilizado difere em muitas coisas. No primeiro exemplo, o= s dados são enviados na mesma linha do endereço, e o dado e= nviado para o programa rlcgi.cgi é o URL, com o valor de www.somer= s.com.br. Já no caso do Itaú os dados são enviados d= e forma a não aparecerem na linha de endereço. Então= como os dados são enviados?

Se você pedir para ver o fonte, verá que cada imagem tem = um formulário específico que tem um campo chamado ID que n&= atilde;o aparece na tela, que tem um dado diferente. Cada vez que voc&eci= rc; executa um novo login, esse dado muda, por motivos de seguranç= a, e é assim que o Itaú controla o acesso às contas = correntes. Esta é uma forma segura e muito simples de se implement= ar segurança e flexibilidade

em uma tela com várias opções.

Uma dúvida freqüente, quanto ao programa CGI, é se= ele fica "rodando" no servidor. Não fica, ele é = executado

a cada requisição de cada cliente, e o programa nã= ;o

"permanece rodando". Vejamos então como funciona:

=

1.Você pode iniciar o seu CGI de duas formas:

• Por um HTML, com um formulário a ser enviado

ao servidor

• Diretamente no CGI, caso em que precisa prever que pode have= r uma requisição sem dados de formulário

2. Uma vez enviado o dado para o CGI o programa é iniciado e ca= ptura as variáveis, se houver.

3. É gerado um HTML resposta, que vai existir apenas na

tela do cliente.

Fisicamente o HTML não existe, ou seja, não é gra= vado arquivo temporário algum, o qual contém um outro formu= lário para que o usuário possa continuar a navegar pelo pro= grama.

4.O programa é encerrado

E esse processo se repete a cada requisição de cada clie= nte.

Como você pode ver, o programa CGI não fica parado espera= ndo alguma resposta de teclado. Em suma, o CGI é um programa que n= ão interage diretamente com o cliente, mas sim com um servidor Web= , e todas as suas saídas são direcionadas para o servidor W= eb, e é possível enviar dados para impressoras (locais ou r= edirecionadas pelo servidor), arquivos em disco, etc.

Então muito cuidado se você costuma utilizar a seguinte e= strutura:

while .t.

@ 10,10 say "nome" get nome

read

if !empty(nome)

exit

else

alert("erro nome não preenchido")

loop

endif

enddo

SSL_CIPHER_ALGKEYSIZE=3D128 Æ Tamanho da chave de criptografia d= o servidor

SL_CIPHER_EXPORT=3Dfalse Æ Se o browser do cliente é para= exportação apenas, entende-se 40 bits apenas

SSL_CIPHER_USEKEYSIZE=3D128 Æ Neste caso estou usando um Netscap= e com chave de 128 bits.

Pois essa estrutura não pode ser utilizada em um CGI.

Como é que o programa recebe os dados do formulário?

=

Agora que entendemos as formas de se enviar os dados para o programa, = devemos entender mais alguns fatos sobre como o dado chega no programa. Q= uando o cliente clicar sobre uma imagem ou botão, os dados s&atild= e;o enviados para o servidor Web que se encarregará de disponibili= zar todos os campos e seus valores, e mais alguns dados que poderemos uti= lizar de várias formas, por exemplo: como verificador de cliente, = no caso de utilizarmos LPs (Linhas Privativas), para verificar se estamos= utilizando um servidor seguro etc.

Você pode ver na tabela 1 alguns dos dados de minha intranet no = meu servidor Web juntamente com uma explicação resumida.

Se você está usando um servidor seguro (HTTPS) verá= ; também vários dados iniciados por SSL. Pode-se ver alguns= desses dados na tabela 2

E os dados do formulário?

Para simplificar a explicação, esses dados são li= dos diretamente do servidor Web pelo FS_WEB.

Então para facilitar o acesso a esses dados eu criei uma vari&a= acute;vel somente para o FS_WEB, que se chama Content_String, uma alus&a= tilde;o às variáveis Content_Lenght

e Query_String, que contém todos os dados do formulário = enviado. Os dados contidos nessa variável são de difí= ;cil manuseio, pois todos os caracteres que não estão entre= a/z, 0/9 ou A/Z, são substituídos pelo seu código h= exadecimal, processo que é conhecido como "escape", e ca= da campo é separado por & e cada conteúdo de vari&aacut= e;vel inicia com =3D, como podemos ver abaixo:

CONTENT_STRING=3DEscondido=3D2345&Nome=3D&Endereco=3D &Lon= gTexto=3DArea+definida%3A+6+linhas+30+colunas+ com+wrap+autom%E1tico+m%E1= ximo+de+200+

caracteres&cTipoDanca_1=3DBSEG&cTipoDanca_2=3D

RTER&TESTE1=3DLISTA2&TESTE2=3DMLISTA1&TESTE3=3D

LISTA3&ticavel=3DcLing1& Check=3DDBASE

Com a biblioteca FS_WEB o processo de "unescape" (revers&at= ilde;o de um "escaped string"), e de recuperação = de dados, se torna totalmente transparente e muito simples como podemos v= er na próxima página:

cgiconnect():Transfere todos os dados para o executável do Flag= Ship getfield "op" at cOp:Transfere o valor do campo op do form= ulário para a variável cOp.

E para simplificar mais ainda, os nomes dos campos do formulári= o não são "case sensitive", ou seja, tanto faz se= estão em caixa alta ou baixa, logo não se pode ter dois ca= mpos no formulário com o mesmo nome. Exemplo:

Nome, nome.

Fato que seria totalmente aceitável se utilizássemos Jav= aScript, pois para oJavaScript, nome e Nome são dois dados totalme= nte diferentes.

Finalização de tags

O FS_WEB ajuda muito na simplificação do uso dos comand= o de HTML, normalmente chamados de Tags, pois a linguagem utilizada &eacu= te; bastante simplificada, mas a maioria dos recursos está contemp= lada.

Exemplo: se desejamos apresentar um texto em itálico e negrito = com letras vermelhas escrevemos:

SAY TEXT "BOM DIA" NEGRITO ITALICO COLOR NS_RED

ou

SAY TEXT "BOM DIA" BOLD ITALIC COLOR NS_RED

a ordem dos atributos não tem importância alguma, e o res= ultado na tela será:

BOM DIA

E o FS_WEB enviou:

<FONT COLOR=3D"#FF0000"><B><I>BOM DIA</I>= </B></FONT>

Como você pode ver não foi necessário se preocupar= com a finalização de cada um dos atributos, pois neste cas= o o FS_WEB faz isto por você. Já em outros casos isto se tor= na muito mais fácil pois é utilizada a sintaxe Begin / End = veja abaixo:

BEGIN TABLE BORDER 0 ALIGN CENTER WIDTH "100%"

BGCOLOR NS_BLUE

CELLPADDING 0 CELLSPACE 0

BEGIN ROW

BEGIN DATA ALIGN CENTER

MENU LINK "MENU" MENU "Main" ONCLICK=

END DATA

END ROW

END TABLE

Geração de gráficos

Também a geração de gráficos tornou-se mu= ito simples com o uso do FS_WEB, pois nele incorporei uma rotina que faz= todos os cálculos quase automaticamente. No exemplo abaixo, apena= s gráficos de barras verticais estão contemplados.

BEGIN GRAPH g1 size 300,200

GRAPH DATA 124,138,216,143,256,302

GRAPH DATA 201,234,340,210,314,320

GRAPH ATRIBUTES STACKED

GRAPH ATRIBUTES SCALE "50"

GRAPH ATRIBUTES TITLE "Meu primeiro gráfico"

GRAPH ATRIBUTES XLABEL "Horizontal"

GRAPH ATRIBUTES YLABEL "VERTICAL"

GRAPH ATRIBUTES TIME "20:23"

GRAPH ATRIBUTES LEGEND "Peixe voador",

"Total pescado"

END GRAPH

Este código resultará no seguinte gráfico:

É possível utilizar um código JavaScript?

Sim, é possível e muito simples, desde que você te= nha algum conhecimento dessa linguagem. No exemplo abaixo, você pod= e ver como fazer para que, ao se alterar um dado do formulário, el= e seja procurado na base de dados e seja emitido um alerta no caso de j&a= acute; estar cadastrado, tudo isto feito em uma segunda janela, que n&ati= lde;o tem menu, barra de navegação etc. Veja tabela 3.

Na linha Get name Size 30 Maxlen 30 Onchange

testname() é gerado um código HTML. Ao ser feita alguma = alteração nesse campo, será executada a funç&= atilde;o testname(), que está logo acima.

A função testname() não abrirá uma nova ja= nela se o nome estiver vazio, senão será criada uma nova ja= nela (nova=3Dwindow.open(... ) e nela será criado um novo formul&a= acute;rio que será enviado para o CGI automaticamente document.tes= te.submit()), somente então o CGI irá processar a verifica&= ccedil;ão da requisição.

Todo esse processo pode parecer muito lento, mas apesar de muitos de n= ós não termos um link de mais de 56kbps, isto fica muito r&= aacute;pido, desde que:

1. As telas resultantes não contenham mais de trezentos registr= os com quatro ou cinco colunas.

2. Não existam tabelas muito grandes.

Outro fato que torna a velocidade de resposta muito boa, é que = no caso do Linux, a resposta gerada pelo CGI é enviada diretamente= para o cliente, ao contrário de outros sistemas operacionais que = geram um arquivo intermediário para depois enviá-lo ao clie= nte.

Veja no site o código completo desse exemplo no arquivo FSWEBCA= D.PRG.

say SCRIPT ;

"function testname() {"+CRLF+" var retval =3D false= "+CRLF+

"if (document.adddata.name.value.length=3D0) {"+CRLF+&qu= ot;retval =3D false "+CRLF+"}"+CRLF+;

"else { "+CRLF+"document.adddata.name.focus()"= +CRLF+;

"nova=3Dwindow.open(‘’,’erro’,’toolb= ar=3D0,location=3D0,directories=3D0,status=3D1,menubar=3D0,scrollbars=3D1= ,;

resizable=3D1,width=3D350,height=3D100,dependent=3Dno,screenX=3D44= 0,screenY=3D20')"+CRLF+;

" nova.document.write(‘<body>’)"+CRLF+= ;

" nova.document.write(‘<form name=3Dteste method=3D= post action=3D/cgi-bin/cad.sh>’)"+CRLF+;

" nova.document.write(‘<input type=3Dhidden name=3D= op value=3Dshowname>’)"+CRLF+;

" nova.document.write(‘<input type=3Dhidden name=3D= name>’)"+CRLF+;

" nova.document.write(‘</form>’)"+CRLF= +;

" nova.document.teste.name.value=3Ddocument.adddata.name.va= lue"+ CRLF+;

" nova.document.write(‘<script>’)"+CRL= F+;

" nova.document.write(‘document.teste.submit()’)&= quot;+CRLF+;

" nova.document.write(‘</script>’)"+CR= LF+;

" nova.document.write(‘</body>’)"+CRLF= +;

" }"+CRLF+;

"return retval"+CRLF+;

"}"+CRLF

begin form "adddata" action "/cgi-bin/cad.sh" = hidden "op" value "adddata"

GET name SIZE 30 MAXLEN 30 ONCHANGE testname()

Outras perguntas comuns que envolvem transações via Inte= rnet:

É possível utilizar o FS_WEB para e-commerce?

Sim, certamente que sim, mas lembre-se de que para realizar transa&cce= dil;ões com número de cartões de crédito &eac= ute; necessário dispor de um servidor com o que costumamos chamar = de "site seguro", o que independe do FS_WEB e tem a ver s&oacu= te; com seu servidor Web. Para se ter o que melhor nível de segura= nça, é aconselhável utilizar o módulo ssl do = apache (mod_ssl), que pode ser encontrado em www.modssl.org, o que permit= e a instalação de um site com até 128 bits de cripto= grafia, com uma chave a ser comprada de qualquer provedor de chave de cri= ptografia como VeriSign e muitos outros. Não utilize a chave de de= monstração, ela não é realmente segura, ela i= mita a segurança de 128 bits.

Chave 128bit para o Netscape?

Para que o seu Netscape tenha um maior nível de criptografia ut= ilize o programa Fortify (www.fortify.net). Ele eleva seu Netscape para u= m nível de segurança maior. Não é ilegal mesm= o para os que não moram nos Estados Unidos, mas é sempre bo= m verificar se sua empresa permite que você utilize uma chave de 12= 8 bits. Se você está utilizando o Netscape que veio com o Li= nux-Conectiva 4.0 não é necessário utilizar o Fortif= y pois já está atualizado. Antes de baixar o programa, veri= fique se o seu Netscape já não está fortificado?! &E= acute; só utilizar o menu do Netscape em Help Æ About se ap= arecer na tela algo como: This version supports U.S. Security with RSA Pu= blic Key Cryptography, MD2, MD5, RC2-CBC, RC4,DES-CBC, DES-EDE3-CBC, o Ne= tscape já está fortificado.

Caso você tenha alguma dúvida, dica ou comentário = não deixe de nos enviar para que esta coluna traga sempre novidade= s para todos.

Veja este programa sendo executado na Internet em www.somers.com.br &#= 151; em FS_WEB Æ Demonstração 2.

 

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade