comandos cgi. Limpar e-commerce

E-commerce em russo compreensível. Como funcionam os negócios na Internet?

Recentemente, mais e mais projetos relacionados ao comércio online surgiram. Estudando essa direção, não consegui encontrar uma descrição geral e compreensível do processo. Portanto, decidi fazer algo como uma folha de dicas, que você sempre pode consultar para entender o procedimento em uma área como o comércio eletrônico.

Já vou fazer uma reserva que foquei nos processos e canais que ajudam a trazer clientes.

E-commerce: do que se trata?

Definições de várias fontes dizem algo sobre a venda de bens ou serviços pela Internet. Em palavras simples, o comércio eletrônico é qualquer atividade na rede em que o dinheiro apareça.

Compras, vendas, seguros, bancos, dinheiro eletrônico, tudo está aqui. Pegue, assine.

Do alvo

Para entender a questão, proponho começar a jornada desde o final. Qual é o objetivo de qualquer negócio? Isso mesmo, ganhar dinheiro. Então, imagine qualquer produto, por exemplo, meias de silicone. Por que não!

Peguei a primeira coisa que me veio à mente, acabou que é isso ...

Nossa tarefa é ganhar dinheiro com essas meias. Pensamos na Internet. Hmm… por que não “cortar” o site e é assim que as vendas vão, apenas me mantenha nas Maldivas! Mas, nem tudo é tão simples.

Eu realmente gosto de desenhar. Isso ajuda a entender os vários processos. Vamos desenhar?!

Até agora, nosso modelo se parece com isso. Pegamos meias, colocamos na internet e ganhamos dinheiro. É ótimo! Os olhos ardem, as palmas das mãos suam e já quero entrar nesse negócio. Mas você precisa fazer um site ou uma plataforma para venda?

Site ou plataforma para venda

Existem várias soluções para colocar seu produto na World Wide Web. Você pode criar seu próprio site ou usar sites de terceiros (grupos, páginas em redes sociais, quadros de avisos, etc.). Vamos parar no local.

Eles encomendaram um site, pegaram um modelo pronto ou criaram eles mesmos usando o construtor (o CMS pode ser pesquisado no Google), não importa. Em seguida, eles colocaram um monte de meias de silicone de vários tipos e ficaram felizes.

Perdoe-me por interromper minha leitura. Entre no meu canal do telegram. Novos anúncios de artigos, desenvolvimento de produtos digitais e growth hack, está tudo lá. Esperando Por Você! Nós continuamos ...

Sistemas de pagamento

Mas para que uma pessoa possa comprar de você aqui e agora, será necessário ajustar os sistemas de pagamento. Este é um tipo de serviço que permite fazer compras online através de: cartões bancários, dinheiro na Internet, telemóveis e um monte de outras coisas. Para isso, você terá que compartilhar uma porcentagem das transações, mas assim simplificará muito sua vida.

Escolha o serviço que mais lhe convém. Em algum lugar haverá uma porcentagem maior e em algum lugar um assinante ou outra coisa. Basta pesquisar um pouco sobre a questão. Coloque você mesmo o código necessário no site, vincule todas as transações à sua conta de cartão e pronto!

Isso parece ser tudo. Tem site, fichas de produtos, e até o botão “comprar” funciona, mas falta alguma coisa... Não tem fluxo de clientes que vão comprar.

fluxos de clientes

Onde: CAC = Custo de Aquisição de Novo Cliente. MCC (marketingcampaigncosts) = O custo total de gastos com marketing para adquirir (mas não reter) clientes. W (salários) = Salário para profissionais de marketing e gerentes de vendas. S (software) = Custo do software usado em publicidade e vendas (por exemplo, plataforma de vendas, automação de marketing, teste A/B, serviços analíticos, etc.). PS (professionalservices) = Custo dos serviços profissionais prestados aos departamentos de marketing e vendas (design, consultoria, etc.). O (outros) = Outras despesas gerais relacionadas com os departamentos de marketing e vendas. CA (clientes adquiridos) = Número total de clientes adquiridos.

Mas não devemos esquecer a qualidade do cliente, o LTV vai ajudar aqui.

Indicadores importantes: LTV

O Live Time Value, ciclo de vida do cliente, é outra métrica de comércio eletrônico a ser considerada. Ele mostra quanta receita um cliente traz em média. Existem diferentes abordagens para o cálculo, escolhi o lucro real como um dos mais precisos.

É simplesmente a soma da receita total do histórico de compras para cada cliente individual. Adicione a soma de todas as compras (transações) do cliente à transação N, onde a transação N é a última compra que o cliente fez em sua empresa. Se você tiver acesso a todos os dados de transações do cliente, poderá calculá-los facilmente usando o Excel.

LTV = (transação 1 + transação 2 + transação 3… + transação N) x participação nos lucros na receita.

O cálculo do LTV com base no lucro líquido, em última análise, mostra o lucro real que o cliente traz para sua empresa. Aqui, são levados em consideração o custo do atendimento ao cliente, o custo de retenção, o custo de aquisição etc. O resultado é todo um complexo de cálculos baseados em dados individuais. O lucro acumulado gerado por um único cliente ao longo do tempo lhe dará uma compreensão precisa da lucratividade de seus clientes até o momento.

Outras abordagens podem ser encontradas em.

Métricas importantes: relação CAC para LTV

Para entender a viabilidade de um negócio, é muito importante observar a proporção das duas métricas CAC:LTV mencionadas.

  • Menos de 1:1 - Você está caminhando para a falência.
  • 1:1 - Você perde dinheiro a cada cliente atraído.
  • 1:2 - Parece bom, mas parece que você não está investindo o suficiente e pode crescer mais rápido. Lance campanhas de aquisição de clientes mais agressivas e alcance proporções próximas de 1:3.
  • 1:3 - Relação ideal. Você tem um negócio próspero e um modelo de negócios forte.

Indicadores importantes: o ROI não é esquecido

Como discutimos acima, no comércio eletrônico é necessário entender claramente se é lucrativo usar o canal de aquisição ou não. Além do LTV e do CAC, existe outro indicador importante, esse é o ROI. Mostra se o seu investimento valeu a pena, no nosso caso em publicidade. Aquilo é. quanto 1 rublo investido nos trouxe no final.

Para o cálculo, uma fórmula muito simples é usada:

Onde “Receita da campanha” é a diferença entre a receita do canal e o custo do seu produto. E para calcular o lucro, subtraia mais custos de publicidade.

Assim, uma fórmula mais detalhada ficaria assim:

ROI = (Receita do Canal - Custo) - Custos de Publicidade / Custos de Publicidade x 100%

Leia um exemplo mais detalhado com um cálculo. Na verdade, esta fórmula simples é colocada toda na mesma tabela do Excel, onde tudo é calculado automaticamente.

Todos os três indicadores que analisamos são importantes no comércio eletrônico. Cada um deles permite que você encontre gargalos em seus fluxos e trabalhe com eles. É neles que reside o potencial de crescimento do negócio. Acrescentei um pouco mais ao nosso modelo com meias.

Não dá para encaixar tudo em um só material, e quem vai ler por tanto tempo? Posteriormente farei um guia separado sobre as nuances do comércio eletrônico que podem interferir nas vendas.

Total

Em geral, agora você tem uma compreensão geral do comércio on-line ou comércio eletrônico. Além disso, como se costuma dizer: "O diabo está nos detalhes". Estude cada um dos canais separadamente, calcule os indicadores de desempenho e busque novos insights nos detalhes. Vendas pela Internet para você, sim mais! E mais uma coisa minha.

Sim, quase me esqueci, feliz ano novo para vocês, queridos leitores! Desejo a você grandes vitórias e conquistas no próximo ano!

Capítulo 9.

Programação com CGI

Incluir uma seção sobre CGI em um livro de banco de dados pode parecer tão estranho quanto ter um capítulo sobre conserto de automóveis em um livro de receitas. Claro, para ir ao supermercado, você precisa de um carro em boas condições, mas é apropriado falar sobre isso? Uma introdução completa ao CGI e à programação da Web em geral está além do escopo deste livro, mas uma breve introdução a esses tópicos é suficiente para estender a capacidade do MySQL e do mSQL de representar dados no domínio da Web.

Este capítulo destina-se principalmente àqueles que estão aprendendo sobre bancos de dados, mas também gostariam de adquirir algum conhecimento de programação Web. Se o seu sobrenome for Berners-Lee ou Andressen, é improvável que você encontre algo aqui que ainda não saiba. Mas mesmo que você não seja novo em CGI, ter uma referência rápida à mão enquanto mergulha nos mistérios do MySQL e do mSQL pode ser bastante útil.

O que é CGI?

Como a maioria dos acrônimos, Common Gateway Interface (CGI significa Common Gateway Interface) não diz muito. Interface com o quê? Onde fica esse portal? De que comunidade estamos falando? Para responder a essas perguntas, vamos voltar um pouco e dar uma olhada na WWW como um todo.

Tim Berners-Lee, um físico que trabalhou no CERN, criou a Web em 1990, embora o plano remonte a 1988. A ideia era permitir que pesquisadores de física de partículas trocassem dados multimídia de maneira fácil e rápida - texto, imagens e som - através da internet. A WWW consistia em três partes principais: HTML, URL e HTTP. HTML- a linguagem de formatação usada para representar o conteúdo na Web. url- este é o endereço usado para obter conteúdo em formato HTML (ou não) do servidor web. E finalmente http-é uma linguagem que o servidor web entende e permite que os clientes solicitem documentos do servidor.

A capacidade de enviar todos os tipos de informações pela Internet foi uma revolução, mas outra possibilidade logo foi descoberta. Se você pode enviar qualquer texto pela Web, por que não pode enviar um texto criado por um programa e não retirado de um arquivo finalizado? Isso abre um mar de possibilidades. Um exemplo simples é usar um programa que imprima a hora atual para que o leitor veja a hora correta toda vez que visualizar a página. Alguns espertinhos do National Center for Supercomputing Applications (NCSA) que estavam construindo um servidor web viram essa oportunidade, e logo nasceu o CGI.

CGI é um conjunto de regras pelas quais programas em um servidor podem enviar dados para clientes por meio de um servidor web. A especificação CGI foi acompanhada por mudanças no HTML e HTTP que introduziram um novo recurso conhecido como formulários.

Enquanto o CGI permite que os programas enviem dados para um cliente, os formulários estendem essa capacidade permitindo que um cliente envie dados para esse programa CGI. Agora o usuário pode não apenas ver a hora atual, mas também acertar o relógio! Os formulários CGI abriram as portas para a verdadeira interatividade no mundo da Web. Aplicações CGI comuns incluem:

  • HTML dinâmico. Sites inteiros podem ser gerados por um único programa CGI.
  • Mecanismos de busca que encontram documentos com palavras especificadas pelo usuário.
  • Livros de visitas e quadros de avisos onde os usuários podem adicionar suas mensagens.
  • Formulários de pedidos.
  • Questionários.
  • Extraindo informações de um banco de dados hospedado no servidor.

Nos capítulos seguintes, discutiremos todos esses aplicativos CGI, bem como alguns outros. Todos eles fornecem uma excelente oportunidade para conectar o CGI a um banco de dados, que é o que nos interessa nesta seção.

Formulários HTML

Antes de explorar as especificidades do CGI, é útil examinar a maneira mais comum pela qual os usuários finais obtêm uma interface para programas CGI: formulários HTML. Os formulários fazem parte da linguagem HTML que fornece ao usuário final vários tipos de campos. Os dados inseridos nos campos podem ser enviados para o servidor web. Os campos podem ser usados ​​para inserir texto ou ser botões nos quais o usuário pode clicar ou marcar. Aqui está um exemplo de uma página HTML contendo um formulário:

<НТМL><НЕАD><ТITLЕ>minha página de formulário


<р>Esta é uma página de formulário.


Digite seu nome:



Este formulário cria uma string de 40 caracteres onde o usuário pode inserir seu nome. Abaixo da linha de entrada existe um botão, quando pressionado, os dados do formulário são transferidos para o servidor. A seguir estão as tags relacionadas a formulários suportadas pelo HTML 3.2, o padrão mais usado atualmente. Nomes de tags e atributos podem ser inseridos em qualquer caso, mas aderimos à convenção opcional de que as tags de abertura são escritas em maiúsculas e as de fechamento em minúsculas.


Esta tag aponta para o início do formulário. Uma tag de fechamento é necessária no final do formulário

. Entre tags
Três atributos são permitidos: ACTION especifica a URL ou caminho relativo para o programa CGI para o qual os dados serão enviados; METHOD especifica o método HTTP pelo qual o formulário será enviado (pode ser GET ou POST, mas quase sempre usaremos POST); ENCTYPE especifica o método de codificação de dados (deve ser usado apenas se você tiver uma compreensão clara do que está fazendo).


Fornece a maneira mais flexível de entrada do usuário. Na verdade, existem nove tipos diferentes de tags . O tipo é especificado pelo atributo TYPE. O exemplo anterior usa duas tags : um do tipo SUBMIT e outro do tipo TEXT por padrão. Os nove tipos são os seguintes:

TEXTO

Um campo para o usuário inserir uma única linha de texto.

SENHA

O mesmo que TEXT, mas o texto digitado não é exibido na tela.

CAIXA DE VERIFICAÇÃO

Um sinalizador que o usuário pode definir e limpar.

RÁDIO

Um botão de opção que deve ser combinado com pelo menos um outro botão de opção. O usuário pode selecionar apenas um deles.

ENVIAR

O botão que, ao ser clicado, envia o formulário ao servidor web.

REINICIAR

Um botão que, quando clicado, restaura o formulário aos seus valores padrão.

ARQUIVO

Semelhante a uma caixa de texto, mas requer a digitação do nome de um arquivo que será enviado ao servidor.

ESCONDIDO

Um campo invisível que pode armazenar dados.

IMAGEM

Semelhante ao botão ENVIAR, mas você pode definir uma imagem para a imagem no botão.

Exceto tags TYPE de atributo geralmente possuem um atributo NAME que associa os dados inseridos no campo a algum nome. O nome e os dados são passados ​​para o servidor no estilo valor=valor. No exemplo anterior, o campo de texto foi denominado firstname . Você pode usar o atributo VALUE para definir campos do tipo TEXT, PASSWORD , FILE e HIDDEN para valores predefinidos. O mesmo atributo, usado com botões como SUBMIT ou RESET, exibe o texto especificado neles. Os campos do tipo RADIO e CHECKBOX podem ser exibidos como configurados usando o atributo CHECKED sem um valor.

O atributo SIZE é usado para definir o comprimento dos campos TEXT, PASSWORD e FILE. O atributo MAXLENGTH pode ser usado para limitar o comprimento do texto digitado. O atributo SRC especifica a URL da imagem usada no tipo IMAGE. Por fim, o atributo ALIGN especifica o alinhamento da imagem para o tipo IMAGE e pode ser TOP, MIDDLE, BOTTOM (padrão), LEFT ou RIGHT (topo, meio, baixo, esquerda, direita).

.

Curte a tag , na etiqueta , e qualquer texto entre as tags será aceito como texto padrão , semelhante ao atributo VALUE de uma tag . para etiqueta

, dando um lugar para entrar no ensaio. Os dados são denominados "ensaio". O bloco de texto tem 70 caracteres de largura e 10 linhas de profundidade. Espaço entre tags

pode ser usado como um ensaio de amostra. -->

tipos "SUBMIT" e "RESET", respectivamente. O botão "ENVIAR" possui um rótulo "Inserir dados" substituído e o botão "RESET" possui um rótulo padrão (definido pelo navegador). Clicar no botão "ENVIAR" enviará os dados para o servidor da Web, o botão "RESET" restaurará os dados R ao seu estado original, excluindo todos os dados inseridos pelo usuário. -->


O único tipo de entrada que não usamos aqui é o tipo IMAGE para a tag . Ele pode ser usado como um método alternativo de envio de formulários. No entanto, o tipo IMAGE raramente é compatível com navegadores baseados em texto e não tão responsivos, portanto, é prudente evitá-lo, a menos que seu site tenha um estilo gráfico rico.

Agora que você está familiarizado com os fundamentos dos formulários HTML, está pronto para explorar o próprio CGI.

especificação CGI

Então, qual é exatamente o "conjunto de regras" que permite que um programa CGI em, digamos, Batavia, Illinois, se comunique com um navegador da Web na Mongólia Exterior? A especificação oficial do CGI, junto com uma série de outras informações sobre o CGI, pode ser encontrada no servidor NCSA em http://hoohoo . ncsa.uluc.edu/cgi/. No entanto, este capítulo existe para que você não precise viajar muito e procurá-lo sozinho.

Existem quatro maneiras pelas quais o CGI passa dados entre o quadro CGI-npor e o servidor Web e, portanto, o cliente Web:

  • variáveis ​​ambientais.
  • Linha de comando.
  • Dispositivo de entrada padrão.
  • dispositivo de saída padrão.

Com esses quatro métodos, o servidor envia todos os dados enviados pelo cliente para o programa CGI. O programa CGI então faz sua mágica e envia a saída de volta para o servidor, que a encaminha para o cliente.

Esses dados são baseados em um servidor Apache HTTP. O Apache é o servidor web mais usado e roda em quase todas as plataformas, incluindo Windows 9x e Windows NT. No entanto, eles podem ser aplicados a todos os servidores HTTP que suportam CGI. Alguns servidores proprietários, como os da Microsoft e Netscape, podem ter recursos adicionais ou funcionar de maneira diferente. Como a face da Web continua a mudar em um ritmo incrível, os padrões ainda estão evoluindo e o futuro certamente mudará. No entanto, no que diz respeito ao CGI, essa tecnologia parece estar bem estabelecida - o preço disso é que outras tecnologias, como applets, a suplantaram. Quaisquer programas CGI que você escrever usando essas informações quase certamente poderão ser executados na maioria dos servidores da Web por muitos anos.

Quando um programa CGI é chamado por meio de um formulário, a interface mais comum, o navegador envia uma string longa para o servidor que começa com o caminho para o programa CGI e seu nome. Isso é seguido por vários outros dados, chamados de informações de caminho, que são passados ​​para o programa CGI por meio da variável de ambiente PATH_INFO (Figura 9-1). As informações do caminho são seguidas por um "?" seguido dos dados do formulário, que são enviados ao servidor usando o método HTTP GET. Esses dados são disponibilizados para o programa CGI por meio da variável de ambiente QUERY_STRING. Quaisquer dados que a página enviar usando o método HTTP POST, que é o mais comumente usado, serão passados ​​para o programa CGI via entrada padrão. Uma string típica que um servidor pode receber de um navegador é mostrada na Figura 1. 9-1. programa nomeado ler formulário no catálogo cgi-bin chamado pelo servidor com informações de caminho adicionais informação extra e choice=help request data - presumivelmente como parte do URL original. Finalmente, os próprios dados do formulário (o texto "programação CGI" no campo "palavras-chave") são enviados através do método HTTP POST.

Variáveis ​​ambientais

Quando um servidor executa um programa CGI, ele primeiro passa alguns dados para ele executar na forma de variáveis ​​de ambiente. Existem dezessete variáveis ​​definidas oficialmente na especificação, mas muitas outras são usadas não oficialmente por meio de um mecanismo descrito abaixo chamado HTTP_/nec/zams/n. programa CGI

tem acesso a essas variáveis ​​como qualquer variável de ambiente shell quando executado a partir da linha de comando. Em um shell script, por exemplo, a variável de ambiente F00 pode ser acessada como $F00; em Perl esta chamada se parece com $ENV("F00" ); em C - getenv("F00" ); e assim por diante.Tabela 9-1 lista as variáveis ​​que são sempre definidas pelo servidor, mesmo que sejam nulas. Além dessas variáveis, os dados retornados pelo cliente no cabeçalho da solicitação são atribuídos a variáveis ​​no formato HTTP_F00 , onde F00 é o nome do cabeçalho. Por exemplo, a maioria dos navegadores da Web inclui informações de versão em um cabeçalho denominado USEfl_AGENT . Sua estrutura CGI npor pode obter essas informações da variável HTTP_USER_AGENT.

Tabela 9-1.Variáveis ​​de ambiente CGI

variável de ambiente

Descrição

COMPRIMENTO DO CONTEÚDO

O comprimento dos dados passados ​​pelos métodos POST ou PUT, em bytes.

TIPO DE CONTEÚDO

O tipo MIME dos dados anexados usando os métodos POST ou PUT.

GATEWAY_INTERFACE

Número da versão da especificação CGI suportada pelo servidor.

PATH_INFO

Informações de caminho adicionais fornecidas pelo cliente. Por exemplo, para um pedido http://www.myserver.eom/test.cgi/this/is/a/ caminho?campo=verde o valor da variável PATH_INFO será /este/é/um/caminho.

PATH_TRANSLATED

O mesmo que PATH_INFO , mas o servidor produz todos


Uma tradução possível, por exemplo, uma extensão de nome como "-account". »

QUERY_STRING

Todos os dados após o "?" na URL. Esses também são os dados passados ​​quando o REQ-UEST_METHOD do formulário é GET.

REMOTE_ADDR

O endereço IP do cliente que faz a solicitação.

HOSPEDEIRO REMOTO

O nome do host da máquina cliente, se disponível.

REMOTE_IDENT

Se o servidor web e a identificação do tipo de suporte ao cliente identd, então é o nome de usuário da conta que está fazendo a solicitação.

REQUEST_METHOD

O método usado pelo cliente para fazer a solicitação. Para os programas CGI que estamos prestes a criar, geralmente será POST ou GET.

NOME DO SERVIDOR O nome do host - ou endereço IP se o nome não estiver disponível - da máquina na qual o servidor da Web está sendo executado.
PORTA DO SERVIDOR O número da porta usada pelo servidor da web.
SERVER_PROTOCOL
O protocolo usado pelo cliente para se comunicar com o servidor. No nosso caso, esse protocolo é quase sempre HTTP.
SERVER_SOFTWARE Informações de versão do servidor web que executa o programa CGI.

SCRIPT_NAME

O caminho para o script a ser executado, conforme especificado pelo cliente. Pode ser usado quando uma URL se refere a si mesma, de modo que os scripts referenciados em locais diferentes possam ser executados de forma diferente dependendo do local.

Aqui está um exemplo de script Perl CGI que imprime todas as variáveis ​​de ambiente definidas pelo servidor, bem como todas as variáveis ​​herdadas, como PATH, definidas pelo shell que iniciou o servidor.

#!/usr/bin/perl -w

imprimir<< HTML;

Tipo de conteúdo: text/html\n\n

<р>Variáveis ​​ambientais

HTML

foreach (chaves %ENV) ( print "$_: $ENV($_)
\n"; )

imprimir<

HTML

Todas essas variáveis ​​podem ser usadas e até modificadas pelo seu programa CGI. No entanto, essas alterações não afetam o servidor da Web que iniciou o programa.

Linha de comando

O CGI permite que argumentos sejam passados ​​para um programa CGI como opções de linha de comando, o que raramente é usado. Raramente é usado porque suas aplicações práticas são poucas e não vamos nos deter nele em detalhes. O ponto principal é que, se a variável de ambiente QUERY_STRING não contiver o caractere " = ", o programa CGI será executado com parâmetros de linha de comando obtidos de QUERY_STRING . Por exemplo, http://www.myserver.com/cgi- bin/dedo?raiz irá executar o finger root em www.myserver.com.

Existem duas bibliotecas principais que fornecem a interface CGI para Perl. O primeiro deles - cgi-lib.pl Utilitário cgi-lib.pl muito comum porque por muito tempo foi a única grande biblioteca disponível. Ela foi projetada para funcionar em Perl 4, mas também funciona com Perl 5. A segunda biblioteca, CGI.pm, mais novo e em muitos aspectos superior cgi-lib.pl CGI.pm escrito para Perl 5 e usa um esquema totalmente orientado a objetos para trabalhar com dados CGI. Módulo CGI.pm analisa a entrada padrão e a variável QUERY_STRING e armazena os dados em um objeto CGI. Seu programa só precisa criar um novo objeto CGI e usar métodos simples como paramQ para extrair os dados necessários. O Exemplo 9-2 serve como uma breve demonstração de como CGI.pm interpreta os dados. Todos os exemplos de Perl neste capítulo usarão CGI.pm.

Exemplo 9-2. Analisando dados CGI em Perl

#!/usr/bin/perl -w

usar CGI qw(:padrão);

# O módulo CGI.pm é usado. qw(:padrão) importações

# namespace de funções CGI padrão para obter

# código mais limpo. Isso pode ser feito se o script

# apenas um objeto CGI é usado.

$mycgi = novo CGI; #Cria um objeto CGI que será a "porta de entrada" para os dados do formulário

@campos = $mycgi->param; # Extraia os nomes de todos os campos do formulário preenchidos

cabeçalho de impressão, start_html("teste CGI.pm"); ft métodos "header" e "start_html",

# oferecido

# CGI.pm facilita a obtenção do HTML.

# "header" gera o cabeçalho HTTP necessário, um

#"start_html" gera um cabeçalho HTML com o nome fornecido,

#a marca também .

imprimir"<р>Dados do formulário:
";

foreach (@campos) ( imprime $_, ":",- $mycgi->param($_), "
"; }

# Para cada campo, exiba o nome e o valor obtido usando

# $mycgi->param("nome do campo").

imprimir end_html; # Abreviação para saída de tags finais "".

Processando entrada em C

Como as principais APIs para MySQL e mSQL são escritas em C, não abandonaremos completamente o C em favor do Perl, mas daremos alguns exemplos de C onde apropriado. Existem três bibliotecas C amplamente usadas para programação CGI: cgic Tom Boutell*; cgihtml Eugene Kim e libcgi da EIT*. nós acreditamos que cgicé o mais completo e fácil de usar. No entanto, falta a capacidade de enumerar todas as variáveis ​​de formulário quando elas não são conhecidas por você com antecedência. Na verdade, ele pode ser adicionado com um patch simples, mas isso está além do escopo deste capítulo. Portanto, no Exemplo 9-3, usamos a biblioteca cgihtml, para repetir o script Perl acima em C.

Exemplo 9-3.Analisando dados CGI em C

/* cgihtmltest.c - Programa CGI genérico para imprimir chaves e seus valores

a partir dos dados recebidos do formulário */

#incluir

#include "cgi-lib.h" /* Contém todas as definições de função CGI */

#include "html-lib.h" /* Contém "todas as definições de funções auxiliares para HTML */

void print_all(lllist 1)

/* Essas funções fornecem dados enviados por formulário no mesmo formato do script Perl acima. Cgihtml também fornece uma função interna

Print_entries() que faz o mesmo usando o formato de lista HTML. */(

nó*janela;

/* O tipo "nó" é definido na biblioteca cgihtml e refere-se a uma lista encadeada que contém todos os dados do formulário. */

janela = i.head; /* Define um ponteiro para o início dos dados do formulário */

while (window != NULL) ( /* Atravessa a lista encadeada até o último elemento (primeiro vazio) */

printf("%s:%s
\n",window->entry.name,replace_ltgt(window->entry.value));

/* Dados de saída. Replace__ltgt() é uma função que entende a codificação HTML do texto e garante que ela seja exibida corretamente no navegador do cliente. */

janela = janela->próximo; /* Move para o próximo elemento na lista. */

} }

int principal() (

entradas da lista; /* Ponteiro para dados analisados*/

estado int; /* Um inteiro representando o status */

html_cabeçalho(); /* Função auxiliar HTML que gera o cabeçalho HTML */

html_begin("teste cgihtml");

/* Uma função auxiliar HTML que gera o início da página HTML com o título especificado. */

status = read_cgi_input(&entries); /* Executa a entrada e análise dos dados do formulário */

printf("<р>Dados do formulário:
");

print_all(entradas); /* Chama a função print_all() definida acima. */

html_end(); /* Uma função auxiliar HTML que gera o final da página HTML. */

List_clear(&entries); /* Libera a memória ocupada pelos dados do formulário. */

retornar 0; )

Dispositivo de saída padrão

Os dados enviados por um programa CGI para a saída padrão são lidos pelo servidor da Web e enviados ao cliente. Se o nome do script começar com nph-, os dados são enviados diretamente ao cliente sem intervenção do servidor web. Nesse caso, o programa CGI deve gerar um cabeçalho HTTP válido que o cliente entenda. Caso contrário, deixe o servidor da Web gerar o cabeçalho HTTP para você.

Mesmo que você não use nph-script, você precisa fornecer ao servidor uma diretiva que informará as informações sobre sua emissão. Geralmente é um cabeçalho HTTP Content-Type, mas também pode ser um cabeçalho Location. O cabeçalho deve ser seguido por uma linha vazia, ou seja, uma nova linha ou uma combinação CR/LF.

O cabeçalho Content-Type informa ao servidor que tipo de dados seu programa CGI está servindo. Se esta for uma página HTML, a string deve ser Content-Type: texto/html. O cabeçalho Location informa ao servidor uma URL diferente - ou um caminho diferente no mesmo servidor - para onde direcionar o cliente. O título deve ficar assim: Localização: http:// www. myserver. com/outro/lugar/.

Após os cabeçalhos HTTP e a string vazia, você pode enviar os dados reais que seu programa produz - uma página HTML, uma imagem, texto ou qualquer outra coisa. Entre os programas CGI que acompanham o servidor Apache estão nph-test-cgi E teste cgi, que demonstram bem a diferença entre cabeçalhos nph e não-nph, respectivamente.

Nesta seção, usaremos as bibliotecas CGI.pm E cgic, que possuem funções para saída de cabeçalhos HTTP e HTML. Isso permitirá que você se concentre na saída do conteúdo real. Essas funções auxiliares são usadas nos exemplos anteriores neste capítulo.

Recursos importantes dos scripts CGI

Você já sabe basicamente como funciona o CGI. O cliente envia dados, geralmente por meio de um formulário, para o servidor web. O servidor executa o programa CGI, passando dados para ele. O programa CGI faz seu processamento e retorna sua saída ao servidor, que a envia ao cliente. Agora, a partir da compreensão de como os quadros CGI-npor funcionam, precisamos entender por que eles são tão amplamente utilizados.

Embora você já saiba o suficiente deste capítulo para montar um programa CGI simples e funcional, há mais algumas coisas importantes a considerar antes de escrever programas realmente funcionais para MySQL ou mSQL. Primeiro, você precisa aprender a trabalhar com vários formulários. Então você precisa aprender algumas medidas de segurança que impedirão que invasores obtenham acesso ilegal aos arquivos do servidor ou os destruam.

memória de estado

Statefulness é um meio vital de fornecer um bom serviço aos seus usuários, e não apenas para combater criminosos inveterados, como pode parecer. O problema é causado pelo fato de que o HTTP é o chamado protocolo "sem memória". Isso significa que o cliente envia dados para o servidor, o servidor retorna os dados para o cliente e cada um segue seu próprio caminho. O servidor não armazena dados sobre o cliente que possam ser necessários em operações subsequentes. Da mesma forma, não há garantia de que o cliente salvará quaisquer dados sobre a transação que possam ser usados ​​posteriormente. Isso impõe uma limitação imediata e significativa no uso da World Wide Web.

O script CGI sob este protocolo é análogo a não ser capaz de se lembrar de uma conversa. Sempre que você fala com alguém, não importa quantas vezes já tenha falado com essa pessoa antes, você deve se apresentar e encontrar um assunto comum para conversar. Desnecessário dizer que isso não é propício à produtividade. A Figura 9-2 mostra que cada vez que uma solicitação chega a um programa CGI, é uma instância completamente nova do programa sem conexão com a anterior.

No lado do cliente, com o advento do Netscape Navigator, havia uma solução de aparência hacker chamada cookies. Consiste na criação de um novo cabeçalho HTTP que pode ser enviado entre o cliente e o servidor, semelhante aos cabeçalhos Content-Type e Location. O navegador do cliente, ao receber o cabeçalho do cookie, deve armazenar os dados no cookie, bem como o nome do domínio no qual o cookie opera. Posteriormente, sempre que uma URL dentro do domínio especificado for visitada, o cabeçalho do cookie deverá ser devolvido ao servidor para uso em programas CGI nesse servidor.

O método de cookie é usado principalmente para armazenar o ID do usuário. As informações do visitante podem ser armazenadas em um arquivo na máquina do servidor. O ID exclusivo desse usuário pode ser enviado como um cookie para o navegador do usuário, após o qual, cada vez que o usuário visita o site, o navegador envia automaticamente esse ID para o servidor. O servidor passa o ID para o programa CGI, que abre o arquivo correspondente e obtém acesso a todos os dados do usuário. Tudo isso acontece de forma invisível para o usuário.

Por mais útil que seja esse método, a maioria dos grandes sites não o utiliza como único meio de lembrar o estado. Há uma série de razões para isso. Primeiro, nem todos os navegadores suportam cookies. Até recentemente, o principal navegador para deficientes visuais (sem falar em pessoas com baixa velocidade de rede) - Lynx - não suportava cookies. Ele ainda não os apóia "oficialmente", embora alguns de seus "ramos laterais" amplamente disponíveis o façam. Em segundo lugar, e mais importante, os cookies vinculam o usuário a uma máquina específica. Uma das grandes virtudes da Web é que ela pode ser acessada de qualquer lugar do mundo. Independentemente de onde sua página da Web foi criada ou armazenada, ela pode ser exibida em qualquer máquina conectada à Internet. No entanto, se você tentar acessar um site habilitado para cookies da máquina de outra pessoa, todos os seus dados pessoais suportados pelo cookie serão perdidos.

Muitos sites ainda usam cookies para personalizar as páginas do usuário, mas a maioria os está complementando com uma interface de estilo de login/senha tradicional. Se o site for acessado a partir de um navegador que não suporta cookies, a página contém um formulário no qual o usuário insere o nome de login e a senha atribuídos a ele quando visitou o site pela primeira vez. Normalmente esse formulário é pequeno e modesto para não assustar a maioria dos usuários que não estão interessados ​​em nenhuma personalização, mas simplesmente querem ir além. Quando um usuário insere um nome de login e senha no formulário, o CGI encontra o arquivo de dados do usuário como se o nome tivesse sido enviado com um cookie. Usando esse método, um usuário pode se registrar em um site personalizado de qualquer lugar do mundo.

Além das tarefas de contabilizar as preferências do usuário e armazenar informações a longo prazo sobre ele, um exemplo mais sutil de lembrança de estado, fornecido pelos mecanismos de pesquisa populares, pode ser fornecido. Quando você pesquisa usando serviços como AltaVista ou Yahoo, geralmente obtém muito mais resultados do que pode exibir em um formato fácil de ler. Esse problema é resolvido mostrando um pequeno número de resultados - geralmente 10 ou 20 - e fornecendo alguns meios de navegação para visualizar o próximo grupo de resultados. Embora esse comportamento pareça comum e esperado para o internauta médio, a implementação real não é trivial e requer que o estado seja lembrado.

Quando um usuário faz uma solicitação pela primeira vez a um mecanismo de pesquisa, ele coleta todos os resultados, possivelmente sujeitos a algum limite predefinido. O truque é fornecer esses resultados ao mesmo tempo em uma pequena quantidade, lembrando que tipo de usuário solicitou esses resultados e que parte ele espera a seguir. Deixando de lado a complexidade do próprio mecanismo de busca, nos deparamos com o problema de fornecer consistentemente ao usuário algumas informações em uma página. Considere o Exemplo 9-4, que mostra um script CGI que gera dez linhas de um arquivo e permite que ele examine as dez linhas seguintes ou anteriores.

Exemplo 9-4. Salvando o estado em um script CGI

#!/usr/bin/perl -w

usar CGI;

Open(F,"/usr/dict/words") or die("Não foi possível abrir! $!");

#Este é o arquivo que será gerado, pode ser qualquer um.

$saída = novo CGI;

sub print_range ( # Esta é a função principal do programa, my $start = shift;

# Linha inicial do arquivo, my $count = 0;

# Ponteiro, minha $linha = "";

# Linha atual do arquivo, imprima $output->header,

$output->start_html("Meu dicionário");

# Gera HTML com o título "Meu dicionário", imprime " \n";

enquanto (($contagem< $start) and ($line = )) ($contagem++; )

# Pular todas as linhas antes do início, while (($count< $start+10) and ($line ? )) ( imprime $linha; $contagem++; )

# Imprima as próximas 10 linhas.

meu $newnext = $start+10; meu $newprev = $start-10;

# Definir strings iniciais para URLs "Próximo" e "Anterior",

imprimir"

";

excepto ($start == 0) ( # Activar URL "Anterior" excepto se você

# não está mais no começo.

imprimir qq%Anterior%; )

excepto (eof) ( # Incluir "Próximo" URL a menos que você # não no final do arquivo.

imprimir qq%Próximo%;

}

imprimir "HTML;HTML

saída(0); )

# Se não houver dados, recomece,

if (não $output->param) (

&print_range(0); )

# Caso contrário, inicie na string especificada nos dados.

&print_range($output->param("start"));

Neste exemplo, lembrar o estado é feito usando o método mais simples. Não há problema em salvar os dados, pois os mantemos em um arquivo no servidor. Precisamos apenas saber de onde começar a saída, então o script simplesmente inclui o ponto de partida para o próximo ou anterior grupo de linhas na URL, que é tudo o que é necessário para gerar a próxima página.

No entanto, se você precisar de mais do que apenas rolar por um "arquivo", confiar em um URL pode ser complicado. Você pode aliviar essa dificuldade usando um formulário HTML e incluindo dados de estado nas tags. tipo OCULTO. Esse método tem sido usado com sucesso por muitos sites, permitindo vincular programas CGI relacionados ou estender o uso de um único programa CGI, como no exemplo anterior. Em vez de se referir a uma entidade específica, como uma página inicial, os dados de URL podem apontar para um ID de usuário gerado automaticamente.

É assim que o AltaVista e outros mecanismos de pesquisa funcionam. A primeira pesquisa gera um ID de usuário que é incluído implicitamente nas URLs subsequentes. Este ID está associado a um ou mais arquivos contendo os resultados da consulta. Mais dois valores estão incluídos no URL: a posição atual no arquivo de resultado e a direção na qual você deseja avançar nele. Esses três valores são tudo o que é necessário para rodar os poderosos sistemas de navegação dos grandes buscadores.

No entanto, algo mais está faltando. O arquivo usado em nosso exemplo /usr/dieta/palavras muito grande. E se deixarmos no meio da leitura, mas quisermos voltar mais tarde? Se você não se lembra da URL da próxima página, não há como voltar atrás, nem mesmo o AltaVista permite. Se você reiniciar o computador ou começar a trabalhar em outro, é impossível retornar aos resultados da pesquisa anterior sem inserir novamente a consulta. No entanto, essa estabilidade de longo prazo está no centro da personalização do site da qual falamos acima e vale a pena ver como ela pode ser explorada. O Exemplo 9-5 é uma versão modificada do Exemplo 9-4.

Exemplo 9-5. Memória de estado persistente

#!/usr/bin/perl -w

usar CGI;

umask 0;

Open(F,"/usr/dict/words") or die("Não foi possível abrir! $!");

Chdir("users") or die("Não consigo mudar para o diretório $!");

# Este é o diretório onde todos os dados serão armazenados

# sobre o usuário.

Saída = novo CGI;

if (não $output->param) (

imprimir $saída->cabeçalho,

$output->start_html("Meu dicionário");

imprimir "HTML;


<р>Entre com seu nome de usuário:


HTML

saída(0); )

$usuário = $saída->param("usuário");

## Se o arquivo do usuário não existir, crie-o e instale-o

## valor inicial em "0",

if (não -e "$usuário") (

open (U, ">$user") or die("Não é possível abrir! $!");

imprimir U "0\n";

fechar U;

&print_range("0");

## se o usuário existir e não for especificado na URL

## valor inicial, leia o último valor e comece a partir daí.

) elsif (não $output->param("start")) (

Open(U,"Suser") or die("Não foi possível abrir o usuário! $!");

$inicio = ; fechar U;

chomp $starl;

intervalo de impressão ascendente ($start);

## Se o usuário existir e não for especificado na URL

## valor inicial, escreva o valor inicial

## para um arquivo de usuário e iniciar a saída.

) outro(

Open(U,">$user") or die("Não foi possível abrir o usuário para escrita! $!");

print U $output->param("start"), "\n";

fechar U;

&print_range($output->param("start 1)); )

sub intervalo_de_impressão(

meu $início = turno;

minha contagem de $ = 0;

minha $linha = " "

imprimir $saída->cabeçalho,

$output->start_html(" Meu dicionário ");

imprimir"

\n"; 

enquanto (($contagem< $start) and ($line = )) ($contagem++; )

enquanto (($contagem< $start+10) and ($line = ))

imprimir $linha; $contagem++;

meu $newnext = $start+10;

meu $newprev = $start-10;

imprimir"

a menos que (Início == 0)

{

imprimir

qq%

anterior%;

}

a menos que (eof) ( imprima qq%Próximo%;

# Observe que o nome de usuário "username" é anexado ao URL.

# Caso contrário, o CGI esquecerá com qual usuário estava lidando.

}

imprimir $saída->end_html;

saída(0") ;

}

Medidas de segurança

Ao executar servidores de Internet, sejam eles HTTP ou não, a segurança é uma das principais preocupações. A troca de dados entre o cliente e o servidor, realizada no âmbito de

O CGI levanta uma série de questões importantes relacionadas à proteção de dados. O próprio protocolo CGI é bastante seguro. O programa CGI recebe entrada do servidor por meio de entrada padrão ou variáveis ​​de ambiente, ambas seguras. Mas uma vez que um programa CGI está no controle dos dados, suas ações são irrestritas. Um programa CGI mal escrito pode permitir que um invasor obtenha acesso ao sistema do servidor. Considere o seguinte exemplo de programa CGI:

#!/usr/bin/perl -w

usar CGI;

minha $saída = novo CGI;

meu $nome de usuário = $saída"param("nome de usuário");

print $output->header, $output->start_html("Finger Output"),

"

", "dedo $nome de usuário", "
", $saída->end_html;

Este programa fornece uma interface CGI válida para o comando dedo. Se você executar o programa como dedo.cgi, ele listará todos os usuários atuais no servidor. Se você executá-lo como finger.cgi?username=fred, então ele exibirá informações sobre o usuário "fred" no servidor. Você pode até executá-lo como dedo. [e-mail protegido] oo.com para exibir informações sobre o usuário remoto. No entanto, se você executá-lo como finger.cgi?username=fred; [e-mail protegido] coisas indesejadas podem acontecer. O operador backstroke """ " em Perl gera um processo shell e executa um comando que retorna o resultado. Neste programa" dedo $nome de usuário* usado como uma maneira fácil de executar um comando de dedo e obter sua saída. No entanto, a maioria dos shells permite que vários comandos sejam combinados na mesma linha. Por exemplo, qualquer processador como o processador Bourne faz isso com o "; ". É por isso"dedo fred;mail [e-mail protegido] execute o comando primeiro dedo, e então comande correspondência [e-mail protegido] que pode enviar todo o arquivo de senha do servidor para um usuário indesejado.

Uma solução é analisar os dados do formulário para procurar conteúdo malicioso. Você pode, digamos, procurar o símbolo ";" e exclua todos os caracteres que o seguem. É possível tornar esse ataque impossível usando métodos alternativos. O programa CGI acima pode ser reescrito assim:

#!/usr/local/bin/perl -w

usar CGI;

minha $saída = novo CGI;

meu $nome de usuário = $saída->param("nome de usuário");

$|++;

# Desative o buffer para enviar todos os dados para o cliente,

print $output->header, $putput->start_html("Finger Output"), "

\n"; 

$pid = open(C_OUT, "-|");# Este idioma Perl gera um processo filho e abre

# canal entre processos pai e filho,

if ($pid) (# Este é o processo pai.

imprimir ; ft Imprima a saída do processo filho.

imprimir"

", $saída->end_html;

saída(O); ft Encerre o programa. )

elsif (definido $pid) ( # Este é um processo filho.

$|++; # Desabilita o buffer.

exec("/usr/bin/finger",$username) or die("exec() call failed.");

# Execute o programa de dedo com nome de usuário como o único
# argumento da linha de comando. ) else ( die("fork() falhou"); )

# Verificação de erros.

Como você pode ver, este não é um programa muito mais complexo. Mas se você executá-lo como finger.cgi?username=fred; [e-mail protegido] então o programa do dedo será executado com o argumento fred;mail [e-mail protegido] como um nome de usuário.

Como uma medida de segurança adicional, este script executa finger explicitamente como /usr/bin/finger. No caso improvável de um servidor da Web passar um PATH incomum para o seu programa CGI, executar apenas o dedo pode fazer com que o programa errado seja executado. Outra medida de segurança pode ser tomada examinando a variável de ambiente PATH e certificando-se de que ela tenha um valor aceitável. É uma boa ideia remover o diretório de trabalho atual do PATH, a menos que você tenha certeza de que não é esse o caso quando realmente precisa executar o programa nele.

Outra consideração de segurança importante está relacionada aos direitos do usuário. Por padrão, o servidor web executa o programa CGI com os direitos do usuário que iniciou o próprio servidor. Geralmente é um pseudousuário, como "ninguém", que tem direitos limitados, portanto o programa CGI também tem poucos direitos. Isso geralmente é bom, porque se um invasor puder acessar o servidor por meio de um programa CGI, ele não poderá causar muito dano. O exemplo de roubo de senha mostra o que pode ser feito, mas o dano real ao sistema geralmente é limitado.

No entanto, executar como um usuário restrito também limita os recursos do CGI. Se um programa CGI precisar ler ou gravar arquivos, ele só poderá fazê-lo se tiver essa permissão. Por exemplo, no segundo exemplo stateful, um arquivo é mantido para cada usuário. O programa CGI deve ter permissão de leitura e gravação no diretório que contém esses arquivos, sem falar nos próprios arquivos. Isso pode ser feito criando o diretório como o mesmo usuário do servidor, com permissões de leitura/gravação apenas para esse usuário. No entanto, para um usuário como "ninguém", apenas o root tem esse recurso. Se você não for o usuário root, terá que se comunicar com o administrador do sistema para cada alteração no CGI.

Outra maneira é tornar o diretório livre para leitura e gravação, removendo efetivamente qualquer proteção dele. Como a única maneira de acessar esses arquivos do mundo exterior é por meio do seu programa, o perigo não é tão grande quanto parece. No entanto, se for encontrada uma falha no programa, o usuário remoto terá acesso total a todos os arquivos, incluindo a capacidade de destruí-los. Além disso, usuários legítimos que trabalham no servidor também poderão modificar esses arquivos. Se você for usar esse método, todos os usuários do servidor devem ser confiáveis. Além disso, use o diretório aberto apenas para arquivos necessários ao programa CGI; em outras palavras, não coloque arquivos desnecessários em risco.

Se esta for sua primeira exposição à programação CGI, o aprendizado adicional pode ser continuado de várias maneiras. Dezenas de livros foram escritos sobre o assunto, muitos dos quais não assumem nenhum conhecimento de programação. Programação CGI na World Wide Web a editora O "Reilly and Associates cobre material desde scripts simples em diferentes idiomas até truques e truques realmente incríveis. As informações públicas também são abundantes na WWW. É uma boa ideia começar com CGI feito muito fácil(Realmente apenas sobre CGI) em http://www.jmarshall.com/easy/cgi/ .

CGI e bancos de dados

Desde o início da era da Internet, os bancos de dados interagiram com o desenvolvimento da World Wide Web. Na prática, muitas pessoas veem a Web apenas como um gigantesco banco de dados de informações multimídia.

Os mecanismos de pesquisa fornecem um exemplo cotidiano dos benefícios dos bancos de dados. O mecanismo de busca não percorre toda a Internet procurando por palavras-chave no momento em que você as solicita. Em vez disso, os desenvolvedores do site usam outros programas para criar um índice gigante que serve como um banco de dados do qual o mecanismo de busca recupera os registros. Os bancos de dados armazenam informações de uma forma que permite a recuperação rápida de acesso aleatório.

Devido à sua volatilidade, os bancos de dados dão ainda mais poder à Web: eles a transformam em uma interface potencial para qualquer coisa. Por exemplo, a administração do sistema pode ser feita remotamente por meio de uma interface da Web, em vez de exigir que um administrador faça logon no sistema desejado. Conectar bancos de dados à Web está no centro de um novo nível de interatividade na Internet.

Uma das razões pelas quais os bancos de dados estão conectados à Web surge regularmente: grande parte da informação do mundo já está em bancos de dados. Os bancos de dados que existiam antes do advento da Web são chamados de bancos de dados legados (em oposição aos bancos de dados não conectados à Web criados em tempos recentes, que deveriam ser chamados de "má ideia"). Muitas corporações (e até mesmo indivíduos) agora enfrentam o desafio de fornecer acesso a esses bancos de dados legados pela Web. A menos que seu banco de dados legado seja MySQL ou mSQL, este tópico está fora do escopo deste livro.

Como dito antes, apenas sua imaginação pode limitar a comunicação entre bancos de dados e a Web. Atualmente, existem milhares de bancos de dados exclusivos e úteis disponíveis na Web. Os tipos de bancos de dados que operam fora desses aplicativos são bastante diferentes. Alguns deles usam programas CGI como uma interface para um servidor de banco de dados como MySQL ou mSQL. Esses tipos são de maior interesse para nós. Outros usam aplicativos comerciais para interagir com bancos de dados de desktop populares, como Microsoft Access e Claris FileMaker Pro. E outros simplesmente trabalham com arquivos de texto simples, que são os bancos de dados mais simples possíveis.

Esses três tipos de bancos de dados podem ser usados ​​para desenvolver sites úteis de qualquer tamanho e complexidade. Um de nossos objetivos nos próximos capítulos será trazer o poder do MySQL mSQL para a Web usando programação CGI.

Página 1 de 30

Hoje, coisas como um livro de visitas, pesquisa de servidor, um formulário para enviar mensagens são atributos essenciais de quase todos os sites sérios. O problema de introduzir esses e outros sinos e assobios, é claro, em todos os sentidos excita a imaginação de um webmaster novato, privando-o do sono, do apetite e da ânsia de cerveja. Infelizmente, estudar as fontes HTML das páginas dos concorrentes não fornece nada além de links para um certo "cgi-bin" e, mesmo em grupos de notícias, às vezes há uma menção a algum tipo de script cgi. Este artigo é dedicado aos fundamentos do uso desses mesmos scripts cgi para a glória e prosperidade do seu site.

Para começar, acho que precisamos entender os conceitos. Um script CGI é um programa executado em um servidor Web a pedido de um cliente (ou seja, um visitante do site). Este programa não é fundamentalmente diferente dos programas comuns instalados em seu computador - seja o MS Word ou o jogo Quake. CGI não é uma linguagem de programação na qual o script é escrito, mas a Common Gateway Interface é uma interface especial com a qual o script é iniciado e interage.

Breve digressão sobre CGI

Então, o que é computação gráfica- scripts e coisas geralmente semelhantes. Vamos começar com o fato de que seu navegador (quando você digitou URL) está conectado de acordo com o protocolo http com o servidor especificado e pede a ele o arquivo desejado, algo assim:

GET /~paaa/cgi-bin/guestbbok.cgi HTTP/1.0-Esta é a coisa mais importante no pedido

Bem, se for solicitado um arquivo simples, por exemplo .html então, se houver tal arquivo, o servidor enviará uma resposta ao navegador:

HTTP/1.0 200 OK
Tipo de conteúdo: texto/html

Mais depois da linha vazia (é necessário separar cabeçalho de corpo) vem de informações do URL"A ...
Isso é basicamente tudo www.... você vai de link em link ....
Mas e se você precisar trazer algo para esse processo monótono sério interativo, dinâmico, lindo e magnífico....? Bem, há uma resposta para esta pergunta. Apenas o que se no solicitado URL especificar um programa especial ( computação gráfica,programa Interface de gateway comum - Interface de gateway comum) e o fato de que este programa emitirá algo e enviará para o navegador .... O servidor inicia .cgi programa e, por exemplo, depois de processar os dados do formulário, ele insere você em algum lugar do banco de dados e informa que você é um cara grande :)
Bem, espero ter intrigado você ......?

Breve informação sobre o que você precisa saber para escrever computação gráfica scripts: Bem, primeiro de tudo, você precisa saber o que Internet e como funciona (você sabe? ;))) ) Bem, um pouco de habilidades de programação (isso é o mais importante)
Vamos escrever um script simples juntos e depois eu vou te contar onde o cachorro remexeu por aqui ....
Bem, primeiro crie um diretório em seu diretório pessoal cgi-bin:

cd public_html
mkdir cgi-bin
chmod 0777 cgi-bin

A última linha será muito importante.
Pegue um editor e digite: #!/usr/bin/perl
#first.cgi
print "Tipo de conteúdo: text/html\n\n";
imprimir" ";
imprimir"

Olá!!!

";
imprimir "";

Salve-o no diretório cgi-bin sob o nome primeiro.cgi.Bem, como você o salvou?
E agora torne-o executável (afinal, isso é um programa):

chmod +x primeiro.cgi

Bem, estamos nos aproximando do momento solene ... digite na linha do navegador http://www.uic.nnov.ru/~your_login/cgi-bin/first.cgi
e veja o que acontece. Haverá uma de duas coisas, ou o script funcionará e você verá a página gerada por ele (parabéns, chegou em nossa estante!) Ou Erro do Servidor Interno Então não se preocupe, você fez algo errado. Então você precisará de um guia para pegar pulgas. Bem, em primeiro lugar, a verificação da sintaxe pode ser feita da seguinte maneira:

perl -c primeiro.cgi

O Perl imediatamente fornecerá mensagens de erro (bem, acontece que você perdeu um ponto e vírgula, esqueceu de fechar colchetes ou aspas ...) isso pode ser corrigido ao longo do caminho.
Mais logicamente bruto é pular a saída da linha vazia que separa o cabeçalho do corpo:
print "Tipo de conteúdo: text/html\n\n"; #Tudo está correto
print "Tipo de conteúdo: text/html\n"; #ERRO!!!

Vamos analisar o roteiro:
Primeira linha #!/usr/bin/perl Ele simplesmente especifica onde o Perl está localizado no sistema. O segundo é apenas um comentário - você pode cutucar qualquer coisa após o sinal #
Então vem print "Tipo de conteúdo: text/html\n\n"; Este é um cabeçalho que indica o tipo de conteúdo que o script imprime em sua saída padrão STDOUT vai para o servidor para processamento. Uma linha vazia separa o cabeçalho do corpo, que no nosso caso é

Olá!!!



O servidor processará a resposta do script e, com base nela, gerará e enviará uma resposta ao navegador (o servidor geralmente não altera o corpo da mensagem, apenas complementa o cabeçalho com os campos necessários para o protocolo HTTP)

Bem, o básico já foi dominado, nem tudo é tão difícil e deprimente quanto pode parecer à primeira vista
Agora você pode praticar escrevendo esses scripts simples para colocar as mãos nele.

Os proprietários de lojas online estão familiarizados com o conceito de "comércio eletrônico" em primeira mão, certamente sabem a resposta para a pergunta "comércio eletrônico - o que é isso". Mas se você entender a essência, muitas nuances surgem e esse termo assume um significado mais amplo.

Comércio eletrônico: o que é?

O conceito geral é o seguinte: e-commerce é entendido como uma certa forma de fazer negócios, que envolve a inclusão de um conjunto de operações que utilizam a transmissão digital de dados no fornecimento de bens ou na prestação de serviços/obras, inclusive através da Internet.

Assim, é qualquer transação comercial realizada por meio de meio eletrônico de comunicação.

O esquema de trabalho é organizado da seguinte forma:

  • qualquer pessoa pode ser um blogueiro ou qualquer outro dono de sua própria página na Internet) cadastre-se neste sistema;
  • obtém seu próprio link;
  • coloca um código especial em sua página da web - aparece um anúncio do parceiro oficial selecionado da rede de parceiros de comércio eletrônico;
  • monitora a conversão do site;
  • ganha uma certa porcentagem para cada compra de um visitante de seu site que clicou em um link de afiliado.

WP eCommerce

Um grande número de pessoas agora é apaixonado por e-commerce, principalmente pelo desejo de criar seu próprio site, uma loja online exclusiva para vender seus próprios produtos. Para atender a essa demanda crescente, os desenvolvedores se concentraram na criação de modelos de comércio eletrônico (modelos de comércio eletrônico). O que é que vamos considerar mais adiante.

Um desses exemplos de templates é o WordPress e-commerce. É um plug-in de carrinho de compras para WordPress (um dos mais famosos sistemas de gerenciamento de recursos da web, destinado principalmente à criação e organização de blogs). É fornecido totalmente gratuito e permite que os visitantes do site façam compras na página da Internet.

Em outras palavras, este plugin permite que você crie uma loja online (baseada em WordPress). Este plug-in de comércio eletrônico possui todas as ferramentas, configurações e opções necessárias para atender às necessidades atuais.

Graças à World Wide Web, quase qualquer pessoa pode fornecer informações na Internet de uma forma agradável à vista e adequada para ampla divulgação. Sem dúvida você já navegou na Internet e visitou outros sites, e agora provavelmente já sabe que siglas assustadoras como "HTTP" e "HTML" são apenas abreviações de "Web" e "uma forma de expressar informações na Internet". Talvez você já tenha alguma experiência em apresentar informações na Internet.

A Internet provou ser um meio ideal para a distribuição de informações, como evidenciado por sua imensa popularidade e enorme desenvolvimento. Embora alguns questionem a utilidade da Internet e atribuam seu amplo desenvolvimento e popularidade principalmente ao exagero, a Internet é inegavelmente um meio importante para apresentar todos os tipos de informações. Não só existem muitos serviços para fornecer informações atualizadas (notícias, previsão do tempo, eventos esportivos em tempo real) e materiais de referência em formato eletrônico, como também existem quantidades significativas de dados de diferentes tipos. O IRS, que distribuiu todos os seus formulários de impostos de 1995 e outras informações pela World Wide Web, admitiu recentemente ter recebido cartas de fãs de seu site. Quem teria pensado que o IRS receberia cartas de fãs? Não porque seu site fosse bem projetado, mas porque provou ser uma ferramenta verdadeiramente útil para milhares, talvez milhões de pessoas.

O que torna a Web única e um serviço de informações tão atraente? Em primeiro lugar, porque fornece uma interface hipermídia para dados. Considere o disco rígido do seu computador. Normalmente, os dados são expressos de forma linear, semelhante a um sistema de arquivos. Por exemplo, você tem várias pastas e dentro de cada pasta há documentos ou outras pastas. A Web usa um paradigma diferente para expressar informações chamado hipermídia. A interface de hipertexto consiste em um documento e links. Links são palavras nas quais se clica para ver outros documentos ou encontrar outro tipo de informação. A Web estende o conceito de hipertexto para incluir outros tipos de mídia, como gráficos, sons, vídeos (daí o nome "hipermídia"). Destacar texto ou gráficos em um documento permite que você veja informações relacionadas sobre o elemento selecionado em qualquer número de formulários.

Quase todos podem se beneficiar dessa maneira simples e única de apresentar e distribuir informações, desde acadêmicos que desejam compartilhar dados imediatamente com seus colegas até empresários que compartilham informações sobre sua empresa com todos. No entanto, embora dar informações seja extremamente importante, nos últimos anos muitos sentiram que obter informações também é importante.

Embora a Web forneça uma interface hipermídia exclusiva para informações, existem muitas outras maneiras eficientes de distribuir dados. Por exemplo, serviços de rede como o File Transfer Protocol (FTP) e o grupo de notícias "Gopher" existiam muito antes do advento da World Wide Web. O e-mail tem sido o principal meio de comunicação e troca de informações na Internet e na maioria das outras redes quase desde o início dessas redes. Por que a Internet se tornou uma forma tão popular de distribuir informações? O aspecto multimídia da Internet deu uma contribuição tangível para seu sucesso sem precedentes, mas para que a Internet seja mais eficaz, ela deve ser interativa.

Sem a capacidade de receber informações dos usuários e fornecer informações, a Web seria um ambiente completamente estático. A informação só estaria disponível no formato especificado pelo autor. Isso prejudicaria uma das possibilidades da computação em geral: a informação interativa. Por exemplo, em vez de forçar o usuário a navegar por vários documentos como se estivesse navegando em um livro ou dicionário, seria melhor permitir que o usuário identifique palavras-chave de seu interesse. Os usuários podem personalizar como os dados são apresentados em vez de depender de uma estrutura rígida definida pelo provedor de conteúdo.

O termo "servidor da Web" pode ser enganoso porque pode se referir tanto à máquina física quanto ao software que ela usa para interagir com os navegadores da Internet. Quando um navegador solicita um determinado endereço da Web, ele primeiro se conecta à máquina pela Internet, enviando ao software do servidor da Web uma solicitação de documento. Este software é executado continuamente, esperando por tais solicitações e respondendo de acordo.

Embora os servidores possam enviar e receber dados, a funcionalidade do próprio servidor é limitada. Por exemplo, o servidor mais primitivo só pode enviar o arquivo solicitado para o navegador. O servidor geralmente não sabe o que fazer com esta ou aquela entrada adicional. Se o ISP não informar ao servidor como lidar com essas informações extras, o servidor provavelmente irá ignorar a entrada.

Para que o servidor possa realizar outras operações além de pesquisar e enviar arquivos para o navegador da Internet, você precisa saber como estender a funcionalidade do servidor. Por exemplo, um servidor Web não pode pesquisar um banco de dados com base em uma palavra-chave inserida por um usuário e retornar vários documentos correspondentes, a menos que tal capacidade tenha sido programada no servidor de alguma forma.

O que é CGI?

A Common Gateway Interface (CGI) é uma interface para o servidor que permite estender a funcionalidade do servidor. Usando CGI, você pode trabalhar de forma interativa com os usuários que acessam seu site. Em um nível teórico, o CGI permite estender a capacidade do servidor de analisar (interpretar) a entrada do navegador e retornar informações com base na entrada do usuário. Em um nível prático, CGI é uma interface que permite que um programador escreva programas que se comuniquem facilmente com um servidor.

Normalmente, para expandir os recursos do servidor, você mesmo teria que modificar o servidor. Esta solução é indesejável porque requer uma compreensão do nível inferior da programação de rede do Protocolo da Internet. Também exigiria editar e recompilar o código-fonte do servidor ou escrever um servidor personalizado para cada tarefa. Digamos que você queira estender o servidor para atuar como um gateway Web-to-e-mail (Web para e-mail), capturando a entrada do usuário do navegador e enviando-a por e-mail para outro usuário. O código teria que ser injetado no servidor para analisar a entrada do navegador, enviá-la por e-mail para outro usuário e enviar a resposta de volta ao navegador pela conexão de rede.

Primeiro, essa tarefa requer acesso ao código do servidor, o que nem sempre é possível.

Em segundo lugar, é difícil e requer amplo conhecimento técnico.

Em terceiro lugar, isso é aplicável apenas para um servidor específico. Se você precisar mover seu servidor para outra plataforma, terá que executar ou pelo menos gastar muito tempo transferindo o código para essa plataforma.

Por que CGI?

O CGI oferece uma solução portátil e fácil para esses problemas. O protocolo CGI define uma maneira padrão para os programas se comunicarem com um servidor Web. Sem nenhum conhecimento especial, é possível escrever um programa em qualquer linguagem de máquina que faça interface e se comunique com um servidor Web. Este programa funcionará com todos os servidores Web que entendem o protocolo CGI.

A comunicação CGI é feita por entrada e saída padrão, o que significa que, se você souber como imprimir e ler dados usando sua linguagem de programação, poderá escrever um aplicativo de servidor da Web. Além de analisar entrada e saída, programar aplicativos CGI é quase equivalente a programar qualquer outro aplicativo. Por exemplo, para programar um programa "Hello, World!", use as funções de impressão de sua linguagem e o formato definido para programas CGI para imprimir a mensagem apropriada.

Escolhendo uma linguagem de programação

Como o CGI é uma interface genérica, você não está limitado a nenhuma linguagem de máquina específica. Uma pergunta importante frequentemente feita é quais linguagens de programação podem ser usadas para programação CGI? Você pode usar qualquer idioma que permita fazer o seguinte:

  • imprimir em stdout
  • Ler da entrada padrão
  • Ler de modos variáveis

Quase todas as linguagens de programação e muitas linguagens de script fazem essas três coisas, e você pode usar qualquer uma delas.

Os idiomas se enquadram em uma das duas classes a seguir: traduzidos e interpretados. Uma linguagem traduzida como C ou C++ geralmente é menor e mais rápida, enquanto uma linguagem interpretada como Perl ou Rexx às vezes requer que um grande interpretador seja carregado na inicialização. Além disso, você pode distribuir códigos binários (código traduzido em linguagem de máquina) sem código-fonte se seu idioma for traduzível. A distribuição de scripts interpretados geralmente significa distribuição de código-fonte.

Antes de escolher um idioma, primeiro você precisa considerar suas prioridades. Você precisa avaliar os benefícios da velocidade e eficiência de uma linguagem de programação com a facilidade de programar outra. Se você deseja aprender outro idioma, em vez de usar um que já conhece, pondere cuidadosamente as vantagens e desvantagens de ambos os idiomas.

As duas linguagens mais usadas para programação CGI são C e Perl (ambas abordadas neste livro). Ambos têm vantagens e desvantagens claras. Perl é uma linguagem de alto nível, mas poderosa, especialmente adequada para analisar texto. Embora sua facilidade de uso, flexibilidade e poder a tornem uma linguagem atraente para programação CGI, seu tamanho relativamente grande e operação mais lenta às vezes a tornam inadequada para alguns aplicativos. Os programas C são menores, mais eficientes e fornecem controle de sistema de nível inferior, mas são mais difíceis de programar, carecem de rotinas de processamento de texto incorporadas leves e são mais difíceis de depurar.

Qual é a linguagem mais adequada para programação CGI? Aquele que você considera mais conveniente para você em termos de programação. Ambos são igualmente eficazes para programar aplicativos CGI e, com as bibliotecas adequadas, ambos têm recursos semelhantes. No entanto, se você tiver um servidor de difícil acesso, poderá usar programas menores compilados em C. Se precisar escrever rapidamente um aplicativo que exija muito trabalho de processamento de texto, use Perl.

Cuidados

Existem algumas alternativas importantes para aplicativos CGI. Muitos servidores agora incluem programação de API, o que facilita a programação de extensões de servidor diretas em oposição a aplicativos CGI independentes. Os servidores API são geralmente mais eficientes do que os programas CGI. Outros servidores incluem funcionalidade integrada que pode lidar com itens especiais não CGI, como emparelhamento de banco de dados. Por fim, alguns aplicativos podem ser manipulados por algumas novas tecnologias do lado do cliente (em vez do lado do servidor), como Java. O CGI rapidamente se tornará obsoleto diante de mudanças tão rápidas na tecnologia?

Dificilmente. O CGI tem várias vantagens sobre as tecnologias mais recentes.

  • É versátil e portátil. Você pode escrever um aplicativo CGI usando praticamente qualquer linguagem de programação em qualquer plataforma. Algumas das alternativas, como a API do servidor, restringem você a determinados idiomas e são muito mais difíceis de aprender.
  • É improvável que as tecnologias de cliente, como Java, substituam o CGI porque existem alguns aplicativos para os quais os aplicativos de servidor são muito mais adequados para serem executados.
  • Muitas das restrições CGI são restrições HTML ou HTTP. À medida que os padrões da Internet em geral evoluem, também evoluem os recursos do CGI.

Resumo

A Common Gateway Interface é o protocolo pelo qual os programas se comunicam com os servidores da Web. A versatilidade do CGI permite que os programadores escrevam programas de gateway em quase qualquer linguagem, embora existam muitos trade-offs associados a diferentes linguagens. Sem essa capacidade, a criação de páginas da Web interativas seria difícil, exigindo, na melhor das hipóteses, modificações no servidor, e a interatividade seria inacessível para a maioria dos usuários que não são administradores do site.

Capítulo 2. Noções básicas

Há alguns anos, criei uma página para uma faculdade em Harvard onde você poderia enviar seus comentários sobre ela. Na época, a Internet era jovem e a documentação era escassa. Eu, como muitos outros, contei com uma documentação concisa e um sistema de programação criado por outros para aprender programação CGI. Embora esse método de estudo exigisse alguma pesquisa, muitos experimentos e levantasse muitas questões, era muito eficaz. Este capítulo é fruto do meu trabalho inicial com CGI (com alguns refinamentos, é claro).

Embora leve algum tempo para entender e dominar totalmente a interface de gateway comum, o protocolo em si é bastante simples. Qualquer um que tenha algumas habilidades básicas de programação e esteja familiarizado com a Web pode aprender rapidamente como programar aplicativos CGI bastante complexos, assim como eu e outros aprendemos alguns anos atrás.

O objetivo deste capítulo é apresentar os fundamentos do CGI de forma abrangente, embora concisa. Cada conceito discutido aqui é apresentado em detalhes nos capítulos subseqüentes. No entanto, depois de estudar este capítulo, você pode começar a programar aplicativos CGI imediatamente. Depois de atingir esse nível, você poderá aprender os prós e contras do CGI, seja lendo o restante deste livro ou simplesmente experimentando por conta própria.

Você pode reduzir a programação CGI a duas tarefas: obter informações do navegador da Web e enviar as informações de volta ao navegador. Isso é bastante intuitivo quando você pega o jeito do uso normal de aplicativos CGI. Muitas vezes, o usuário é solicitado a preencher um formulário, por exemplo, para inserir seu nome. Depois que o usuário preenche o formulário e pressiona Enter, essas informações são enviadas para o programa CGI. O programa CGI deve, então, converter essas informações no que entende, processá-las adequadamente e enviá-las de volta ao navegador, seja uma simples confirmação ou o resultado de uma pesquisa de banco de dados multiuso.

Em outras palavras, a programação CGI requer a compreensão de como obter entrada de um navegador da Internet e como enviar a saída de volta. O que acontece entre os estágios de entrada e saída de um programa CGI depende do objetivo do desenvolvedor. Você descobrirá que a principal dificuldade na programação CGI está nesse estágio intermediário; depois de aprender a trabalhar com entrada e saída, isso é basicamente o suficiente para se tornar um desenvolvedor CGI.

Neste capítulo, você aprenderá os princípios por trás da entrada e saída CGI, bem como outras habilidades básicas necessárias para escrever e usar CGI, incluindo coisas como criar formulários HTML e nomear seus programas CGI. Este capítulo aborda os seguintes tópicos:

  • Programa tradicional "Alô, Mundo!";
  • Saída CGI: envio de informações de volta para exibição em um navegador da Internet;
  • Configurar, instalar e executar o aplicativo. Você aprenderá sobre diferentes plataformas e servidores Web;
  • Entrada CGI: Interpretação de informações enviadas pelo navegador da Web. Familiarização com algumas bibliotecas de programação úteis para analisar essa entrada;
  • Um exemplo simples: abrange todas as lições deste capítulo;
  • Estratégia de programação.

Devido à natureza deste capítulo, abordarei apenas levemente alguns tópicos. Não se preocupe; todos esses tópicos são abordados com muito mais profundidade em outros capítulos.

Olá Mundo!

Você começa com uma tarefa de programação introdutória tradicional. Você escreverá um programa que exibirá "Hello, World!" no seu navegador da web. Antes de escrever este programa, você deve entender quais informações o navegador da Web espera dos programas CGI. Você também precisa saber como executar este programa para vê-lo em ação.

O CGI é independente de idioma, então você pode implementar este programa em qualquer idioma. Vários idiomas diferentes são usados ​​aqui para demonstrar a independência de cada idioma. Em Perl, o programa "Hello, World!" mostrado na Listagem 2.1.

Listagem 2.1. Olá Mundo! em Perl. #!/usr/local/bin/perl # Hello.cgi - Meu primeiro programa CGI print "Content-Type: text/html\n\n"; imprimir" \n";imprimir" Olá Mundo!"; imprimir "\n";imprimir" \n";imprimir"

Olá Mundo!

\n";imprimir" \n";

Salve este programa como hello.cgi e instale-o no local apropriado. (Se você não tiver certeza de onde ele está, não se preocupe; você descobrirá na seção "Instalando e executando um programa CGI" posteriormente neste capítulo.) Para a maioria dos servidores, o diretório correto é chamado cgi-bin . Agora, chame o programa do seu navegador da web. Para a maioria, isso significa abrir o seguinte localizador uniforme de recursos (URL):

http://hostname/directoryname/hello.cgi

Hostname é o nome do seu servidor Web e directoryname é o diretório onde você colocou hello.cgi (provavelmente cgi-bin).

Dividindo hello.cgi

Há algumas coisas a serem observadas sobre o hello.cgi.

Primeiro, você usa comandos de impressão simples. Os programas CGI não requerem nenhum descritor de arquivo especial ou descritor de saída. Para enviar a saída para o navegador, basta imprimir em stdout.

Em segundo lugar, observe que o conteúdo da primeira instrução print (Content-Type: text/html) não aparece em seu navegador da Web. Você pode enviar qualquer informação que quiser de volta para o navegador (página HTML, gráficos ou som), mas primeiro você precisa informar ao navegador que tipo de dados você está enviando. Essa linha informa ao navegador que tipo de informação esperar - nesse caso, uma página HTML.

Em terceiro lugar, o programa é chamado hello.cgi. Nem sempre é necessário usar a extensão .cgi com o nome do seu programa CGI. Embora o código-fonte de muitos idiomas também use a extensão .cgi, ela não é usada para indicar um tipo de idioma, mas é uma maneira do servidor identificar um arquivo como um arquivo executável, em vez de um arquivo de imagem, arquivo HTML , ou arquivo de texto. Os servidores geralmente são configurados para tentar executar apenas os arquivos que possuem essa extensão enquanto exibem o conteúdo de todos os outros. Embora o uso da extensão .cgi seja opcional, ainda é considerado uma boa prática.

Em geral, hello.cgi consiste em duas partes principais:

  • informa ao navegador quais informações esperar (Content-Type: text/html)
  • informa ao navegador o que exibir (Hello, World!)

Olá Mundo! em C

Para mostrar a independência dos programas CGI das linguagens, a Listagem 2.2 mostra o equivalente em C do programa hello.cgi.

Listagem 2.2. Olá Mundo! em C. /* hello.cgi.c - Hello, World CGI */ #include int main() ( printf("Tipo de conteúdo: text/html\r\n\r\n"); printf(" \n"); printf(" Olá Mundo!\n"); printf("\n"); printf(" \n"); printf("

Olá Mundo!

\n"); printf(" \n"); )

Observação

Observe que a versão Perl de hello.cgi usa Content-Type print ": text/html\n\n "; Considerando que a versão C usa Printf(" Content-Type: text/html\r\n\r\n ");

Por que Perl imprime a declaração terminando com duas novas linhas (\n), enquanto C printf termina com dois retornos de carro e uma nova linha (\r\n)?

Formalmente, os cabeçalhos (todas as saídas antes da linha vazia) devem ser separados por retornos de carro e novas linhas. Infelizmente, em máquinas DOS e Windows, Perl traduz \r como outra nova linha, não como um retorno de linha.

Embora a exceção \rs em Perl seja tecnicamente incorreta, ela funcionará em quase todos os protocolos e também é portátil em todas as plataformas. Portanto, em todos os exemplos de Perl neste livro, eu uso quebras de linha para separar cabeçalhos, não quebras de linha e quebras de linha.

Uma solução apropriada para este problema é apresentada no Capítulo 4, Conclusão.

Nem o servidor da Web nem o navegador se importam com o idioma usado para escrever o programa. Embora cada linguagem tenha vantagens e desvantagens como linguagem de programação CGI, é melhor usar a linguagem com a qual você se sente mais confortável. (A escolha da linguagem de programação é discutida com mais detalhes no Capítulo 1 "Common Gateway Interface (CGI)").

saída CGI

Agora podemos examinar mais de perto a questão do envio de informações para o navegador da Web. No exemplo "Hello, World!", você pode ver que os navegadores da Web esperam dois conjuntos de dados: um cabeçalho que contém informações como quais informações exibir (por exemplo, tipo de conteúdo: linha) e informações reais (o que é exibido no navegador da web). Esses dois blocos de informações são separados por uma linha em branco.

O cabeçalho é chamado de cabeçalho HTTP. Ele fornece detalhes importantes sobre as informações que o navegador receberá. Existem vários tipos diferentes de cabeçalhos HTTP, e o mais genérico é aquele que você usou antes: Content-Type: header. Você pode usar várias combinações de cabeçalhos HTTP, separados por retornos de carro e novas linhas (\r\n). A linha vazia que separa o cabeçalho dos dados também consiste em um retorno de carro e uma nova linha (por que ambos são necessários é descrito brevemente na nota anterior e detalhado no Capítulo 4). Você aprenderá sobre outros cabeçalhos HTTP no Capítulo 4; você está lidando com um cabeçalho Content-Type:.

Content-Type: O cabeçalho descreve o tipo de dados que o CGI retorna. O formato apropriado para este cabeçalho é:

Tipo de conteúdo: subtipo/tipo

Em que subtipo/tipo é o tipo MIME (Multipurpose Internet Mail Extensions) correto. O tipo MIME mais comum é o tipo HTML: text/html. A Tabela 2.1 lista alguns tipos MIME mais comuns que serão discutidos; uma listagem e análise mais completas dos tipos MIME são fornecidas no Capítulo 4.

Observação

O MIME foi originalmente inventado para descrever o conteúdo dos corpos das mensagens de correio. Tornou-se uma maneira bastante comum de representar informações de tipo de conteúdo. Você pode ler mais sobre MIME em RFC1521. RFCs na Internet significam "Requests for Comments", que são resumos de decisões tomadas por grupos na Internet que estão tentando estabelecer padrões. Você pode ver os resultados do RFC1521 no seguinte endereço: http://andrew2.andrew.cmu.edu/rfc/rfc1521.html

Tabela 2.1. Alguns tipos MIME comuns. Tipo MIME Descrição Texto/html Linguagem de Marcação de Hipertexto (HTML) Texto/simples Arquivos de texto simples Imagem/gif Arquivos de imagem GIF Imagem/jpeg Arquivos de imagem JPEG compactados Áudio/básico Arquivos de áudio Sun *.au Áudio/x-wav Arquivos Windows*. wav

Após o cabeçalho e uma linha vazia, basta imprimir os dados no formulário que você precisa. Se você estiver enviando HTML, imprima as tags HTML e os dados para stdout após o cabeçalho. Você também pode enviar gráficos, som e outros arquivos binários simplesmente imprimindo o conteúdo do arquivo para stdout. Alguns exemplos disso são dados no Capítulo 4.

Instalando e executando um programa CGI

Esta seção se desvia um pouco da programação CGI e fala sobre como configurar seu servidor Web para usar CGI, instalar e executar programas. Você estará familiarizado com os diferentes servidores para diferentes plataformas em mais ou menos detalhes, mas terá que se aprofundar na documentação do seu servidor para encontrar a melhor opção.

Todos os servidores requerem espaço para arquivos de servidor e espaço para documentos HTML. Neste livro, a região do servidor é chamada ServerRoot e a região do documento é DocumentRoot. Em máquinas UNIX, ServerRoot geralmente está em /usr/local/etc/httpd/ e DocumentRoot geralmente está em /usr/local/etc/httpd/htdocs/. No entanto, isso não importa para o seu sistema, então substitua todas as referências a ServerRoot e DocumentRoot por seu próprio ServerRoot e DocumentRoot.

Ao acessar arquivos usando seu navegador da Web, você especifica o arquivo na URL relativa ao DocumentRoot. Por exemplo, se o endereço do seu servidor for mymachine.org, você acessará esse arquivo com o seguinte URL: http://mymachine.org/index.html

Configuração do servidor para CGI

A maioria dos servidores Web é pré-configurada para permitir o uso de programas CGI. Normalmente, dois parâmetros informam ao servidor se o arquivo é um aplicativo CGI ou não:

  • Diretório designado. Alguns servidores permitem que você especifique que todos os arquivos em um diretório designado (geralmente chamado de cgi-bin por padrão) são CGI.
  • Extensões de nome de arquivo. Muitos servidores são pré-configurados para permitir que todos os arquivos terminados em .cgi sejam definidos como CGI.

O método de diretório designado é um resquício (os primeiros servidores o usavam como o único método para determinar quais arquivos eram programas CGI), mas tem várias vantagens.

  • Ele mantém os programas CGI centralizados, evitando que outros diretórios fiquem confusos.
  • Você não está limitado a nenhuma extensão de nome de arquivo específica, portanto, pode nomear os arquivos como quiser. Alguns servidores permitem que vários diretórios diferentes sejam designados como diretórios CGI.
  • Também lhe dá mais controle sobre quem pode escrever CGI. Por exemplo, se você tiver um servidor e oferecer suporte a um sistema com vários usuários e não quiser que eles usem seus próprios scripts CGI sem primeiro revisar o programa por motivos de segurança, você pode designar apenas os arquivos em um diretório centralizado e restrito como CGI . Os usuários terão que fornecer a você programas CGI para instalar e você pode primeiro auditar o código para garantir que o programa não tenha grandes problemas de segurança.

Denotar CGI por meio de uma extensão de nome de arquivo pode ser útil devido à sua flexibilidade. Você não está limitado a um único diretório para programas CGI. A maioria dos servidores pode ser configurada para reconhecer CGI por meio de uma extensão de nome de arquivo, embora nem todos sejam configurados dessa forma por padrão.

Aviso

Lembre-se das questões de segurança ao configurar seu servidor para CGI. Algumas dicas serão abordadas aqui, e o Capítulo 9, Protegendo o CGI, discute esses aspectos com mais detalhes.

Instalando o CGI em servidores UNIX

Independentemente de como seu servidor UNIX está configurado, há várias etapas que você precisa seguir para garantir que seus aplicativos CGI sejam executados corretamente. Seu servidor Web normalmente será executado como um usuário inexistente (ou seja, o usuário UNIX ninguém - uma conta que não possui permissões de arquivo e não pode ser conectada). Os scripts CGI (escritos em Perl, shell Bourne ou outra linguagem de script) devem ser globalmente executáveis ​​e legíveis.

Dica

Para tornar seus arquivos globalmente legíveis e executáveis, use o seguinte comando de permissões do UNIX: chmod 755 filename.

Se você estiver usando uma linguagem de script como Perl ou Tcl, inclua o caminho completo do seu interpretador na primeira linha do seu script. Por exemplo, um script Perl usando perl no diretório /usr/local/bin começaria com a seguinte linha:

#!/usr/local/bin/perl

Aviso

Nunca coloque um interpretador (perl ou o binário Tcl Wish no diretório /cgi-bin. Isso cria um risco de segurança em seu sistema. Isso é abordado com mais detalhes no Capítulo 9.

Alguns servidores UNIX universais

Os servidores NCSA e Apache possuem arquivos de configuração semelhantes porque o servidor Apache foi originalmente baseado no código NCSA. Por padrão, eles são configurados para que qualquer arquivo no diretório cgi-bin (localizado por padrão em ServerRoot) seja um programa CGI. Para alterar a localização do diretório cgi-bin, você pode editar o arquivo de configuração conf/srm.conf. O formato para configurar este diretório é

ScriptAlias ​​Fakedirectoryname realdirectoryname

onde fakedirectoryname é o pseudo nome do diretório (/cgi-bin) e realdirectoryname é o caminho completo onde os programas CGI são realmente armazenados. Você pode configurar mais de um ScriptAlias ​​adicionando mais linhas de ScriptAlias.

A configuração padrão é suficiente para as necessidades da maioria dos usuários. Você precisa editar uma linha no arquivo srm.conf de qualquer maneira para determinar o realdirectoryname correto. Se, por exemplo, seus programas CGI estiverem localizados em /usr/local/etc/httpd/cgi-bin, a linha ScriptAlias ​​​​em seu arquivo srm.conf deve ficar assim:

ScriptAlias ​​​​/cgi-bin/ /usr/local/etc/httpd/cgi-bin/

Para acessar ou vincular a programas CGI localizados neste diretório, use o seguinte URL:

http://hostname/cgi-bin/programname

Onde hostname é o nome do host do seu servidor Web e programname é o nome do seu CGI.

Por exemplo, digamos que você copiou o programa hello.cgi para seu diretório cgi-bin (por exemplo, /usr/local/etc/httpd/cgi-bin) em seu servidor Web chamado www.company.com. Para acessar seu CGI, use o seguinte URL: http://www.company.com/cgi-bin/hello.cgi

Se você deseja configurar o servidor NCSA ou Apache para reconhecer qualquer arquivo .cgi como CGI, você precisa editar dois arquivos de configuração. Primeiro, no arquivo srm.conf, não comente a seguinte linha:

AddType application/x-httpd-cgi .cgi

Isso associará o tipo MIME CGI à extensão .cgi. Agora, precisamos modificar o arquivo access.conf para que possamos executar o CGI em qualquer diretório. Para fazer isso, adicione a opção ExecCGI à linha Option. Será algo como a seguinte linha:

Índices de opções FollowSymLinks ExecCGI

Agora, qualquer arquivo com extensão .cgi é considerado CGI; acesse-o como faria com qualquer arquivo em seu servidor.

O servidor CERN é configurado da mesma forma que os servidores Apache e NCSA. Em vez de ScriptAlias, o servidor CERN usa o comando Exec. Por exemplo, no arquivo httpd.conf, você verá a seguinte linha:

Exec /cgi-bin/* /usr/local/etc/httpd/cgi-bin/*

Outros servidores UNIX podem ser configurados da mesma forma; mais detalhes sobre isso estão descritos na documentação do servidor.

Instalando o CGI no Windows

A maioria dos servidores disponíveis para Windows 3.1, Windows 95 e Windows NT são configurados com um método de "extensão de nome de arquivo" para reconhecimento CGI. Em geral, alterar a configuração de um servidor baseado no Windows requer apenas executar o programa de configuração do servidor e fazer as alterações apropriadas.

Às vezes, configurar um servidor para executar um script (como Perl) corretamente pode ser complicado. No DOS ou no Windows, você não poderá especificar um interpretador na primeira linha de um script, como faria no UNIX. Alguns servidores são pré-configurados para associar certas extensões de nome de arquivo ao interpretador. Por exemplo, muitos servidores Web do Windows assumem que os arquivos que terminam em .pl são scripts Perl.

Se o servidor não implementar esse tipo de associação de arquivo, você poderá definir um arquivo em lote do empacotador que chame o interpretador e o script. Assim como em um servidor UNIX, não instale o interpretador no diretório cgi-bin ou em qualquer diretório acessível pela Web.

Instalando o CGI em um Macintosh

As duas opções de servidor mais famosas para Macintosh são WebStar StarNine e seu predecessor MacHTTP. Ambos reconhecem CGI por sua extensão de nome de arquivo.

O MacHTTP compreende duas extensões diferentes: .cgi e .acgi, que significa CGI assíncrono. Programas CGI regulares instalados no Macintosh (com uma extensão .cgi) manterão o servidor da Web ocupado até que o CGI termine a execução, forçando o servidor a suspender todas as outras solicitações. O CGI assíncrono, por outro lado, permite que o servidor aceite solicitações mesmo durante a execução.

Um desenvolvedor Macintosh CGI usando qualquer um desses servidores Web deve usar a extensão .acgi em vez da extensão .cgi sempre que possível. Deve funcionar com a maioria dos programas CGI; se não funcionar, renomeie o programa para .cgi.

execução CGI

Depois de instalar o CGI, existem várias maneiras de executá-lo. Se o seu CGI for um programa somente de saída, como Hello, World!, você poderá executá-lo simplesmente acessando seu URL.

A maioria dos programas é executada como um aplicativo de servidor para um formulário HTML. Antes de aprender como obter informações desses formulários, primeiro leia uma breve introdução sobre como criar esses formulários.

Tutorial rápido sobre formulários HTML

As duas tags mais importantes em um formulário HTML são as tags E . Você pode criar a maioria dos formulários HTML usando apenas essas duas tags. Neste capítulo, você explorará essas tags e um pequeno subconjunto dos possíveis tipos ou atributos. . Para obter um guia completo e um link para formulários HTML, consulte o Capítulo 3, HTML e formulários.

Marcação

Marcação é usado para determinar qual parte do arquivo HTML deve ser usada para as informações inseridas pelo usuário. Isso se refere a como a maioria das páginas HTML invoca um programa CGI. Os atributos de marca definem o nome e a localização do programa - localmente ou como um URL completo, o tipo de codificação usado e o método de transferência de dados usado pelo programa.

A próxima linha mostra as especificações da tag :

< ACTION FORM = "url" METHOD = ENCTYPE = "..." >

O atributo ENCTYPE não tem função especial e geralmente não é incluído na tag . Informações detalhadas sobre a tag ENCTYPE são fornecidas no Capítulo 3. Uma maneira de usar o ENCTYPE é mostrada no Capítulo 14 "Extensões de marca".

O atributo ACTION refere-se à URL do programa CGI. Depois que o usuário preenche o formulário e fornece informações, todas as informações são codificadas e passadas para o programa CGI. O programa CGI decide por si mesmo a questão de decodificar e processar informações; esse aspecto é abordado em "Aceitando a entrada do navegador", mais adiante neste capítulo.

Finalmente, o atributo METHOD descreve como o programa CGI deve receber entrada. Os dois métodos, GET e POST, diferem em como as informações são passadas para o programa CGI. Ambos são discutidos em "Aceitando entrada do navegador".

Para que o navegador permita a entrada do usuário, todas as tags e informações do formulário devem estar entre as tags . Não se esqueça da tag final

para marcar o fim do formulário. Você não pode ter um formulário dentro de um formulário, embora possa configurar um formulário que permita apresentar informações em diferentes lugares; esse aspecto é discutido extensivamente no Capítulo 3.

Marcação

Você pode criar faixas de entrada de texto, botões de opção, caixas de seleção e outros meios de aceitar entrada usando a tag . Esta seção abrange apenas os campos de entrada de texto. Para implementar este campo, use a tag com os seguintes atributos:

< INPUT TYPE=text NAME = "... " VALUE = "... " SIZE = MAXLENGTH = >

NOME é o nome simbólico da variável que contém o valor digitado pelo usuário. Se você incluir texto no atributo VALUE, esse texto será colocado como padrão no campo de entrada de texto. O atributo TAMANHO permite especificar o comprimento horizontal do campo de entrada conforme ele aparecerá na janela do navegador. Finalmente, MAXLENGTH define o número máximo de caracteres que o usuário pode inserir no campo. Observe que os atributos VALUE, SIZE, MAXLENGTH são opcionais.

Envio de formulário

Se você tiver apenas um campo de texto em um formulário, o usuário poderá enviar o formulário simplesmente digitando as informações no teclado e pressionando Enter. Caso contrário, deve haver alguma outra forma do usuário apresentar a informação. O usuário envia informações usando um botão de envio com a seguinte tag:

< Input type=submit >

Essa tag cria um botão Enviar dentro do seu formulário. Quando o usuário terminar de preencher o formulário, ele poderá enviar seu conteúdo para a URL especificada pelo atributo ACTION do formulário clicando no botão Enviar.

Aceitando entrada do navegador

Acima foram dados exemplos de como escrever um programa CGI que envia informações do servidor para o navegador. Na realidade, um programa CGI que apenas produz dados não tem muitas aplicações (alguns exemplos são dados no Capítulo 4). Uma habilidade mais importante do CGI é receber informações do navegador, um recurso que torna a Web interativa.

O programa CGI recebe dois tipos de informação do navegador.

  • Primeiro, ele obtém várias informações sobre o navegador (seu tipo, o que pode navegar, o host host e assim por diante), o servidor (seu nome e versão, sua porta de execução e assim por diante) e o programa CGI. em si (nome do programa e onde está localizado). O servidor fornece todas essas informações ao programa CGI por meio de variáveis ​​de ambiente.
  • Em segundo lugar, o programa CGI pode receber informações inseridas pelo usuário. Essas informações, depois de codificadas pelo navegador, são enviadas por uma variável de ambiente (o método GET) ou por uma entrada padrão (o método stdin POST).

variáveis ​​ambientais

É útil saber quais variáveis ​​de ambiente estão disponíveis para um programa CGI, tanto para aprendizado quanto para depuração. A Tabela 2.2 lista algumas das variáveis ​​de ambiente CGI disponíveis. Você também pode escrever um programa CGI que gere variáveis ​​de ambiente e seus valores para um navegador da Web.

Tabela 2.2. Algumas variáveis ​​de ambiente CGI importantes Variável de ambiente Finalidade REMOTE_ADDR O endereço IP da máquina do cliente. REMOTE_HOST Host do host da máquina do cliente. HTTP _ACCEPT Lista os tipos de dados MIME que o navegador pode interpretar. Informações do navegador HTTP _USER_AGENT (tipo de navegador, número da versão, sistema operacional, etc.). REQUEST_METHOD GET ou POST. CONTENT_LENGTH O comprimento da entrada se enviada via POST. Se não houver entrada ou se o método GET for usado, este parâmetro é indefinido. QUERY_STRING Contém informações de entrada quando enviadas usando o método GET. PATH_INFO Permite que o usuário especifique um caminho na linha de comando CGI (por exemplo, http://hostname/cgi-bin/programname/path). PATH_TRANSLATED Converte um caminho relativo em PATH_INFO em um caminho real no sistema.

Para escrever um aplicativo CGI que exiba variáveis ​​de ambiente, você precisa saber como fazer duas coisas:

  • Defina todas as variáveis ​​de ambiente e seus respectivos valores.
  • Exibir resultados para o navegador.

Você já sabe como realizar a última operação. Em Perl, as variáveis ​​de ambiente são armazenadas no array associativo %ENV, que é introduzido pelo nome da variável de ambiente. A Listagem 2.3 contém env.cgi, um programa Perl que atingirá nosso objetivo.

Listagem 2.3. Programa Perl, env.cgi, que produz todas as variáveis ​​de ambiente CGI.

#!/usr/local/bin/perl print "Tipo de conteúdo: text/html\n\n"; imprimir" \n";imprimir" Ambiente CGI\n";imprimir"\n";imprimir" \n";imprimir"

Ambiente CGI

\n"; foreach $env_var (chaves %ENV) ( print " $env_var= $ENV($env_var)
\n"; ) imprimir " \n";

Um programa semelhante poderia ser escrito em C; o código completo está na Listagem 2.4.

Listagem 2.4. env.cgi.c em C. /* env.cgi.c */ #include char externo **ambiente; int main() ( char **p = environ; printf("Tipo de conteúdo: text/html\r\n\r\n"); printf(" \n"); printf(" Ambiente CGI\n"); printf("\n"); printf(" \n"); printf("

Ambiente CGI

\n"); while(*p != NULL) printf("%s
\n",*p++); printf(" \n"); )

GET ou POST?

Qual é a diferença entre os métodos GET e POST? GET passa a string de entrada codificada pela variável de ambiente QUERY_STRING, enquanto POST a passa por stdin. O POST é o método preferido, principalmente para formulários com grande quantidade de dados, pois não há restrições quanto à quantidade de informações enviadas, e com o método GET, a quantidade de espaço de mídia é limitada. GET tem uma certa propriedade útil, no entanto; isso é abordado em detalhes no Capítulo 5 Entrada.

Para determinar qual método está sendo usado, o programa CGI verifica a variável de ambiente REQUEST_METHOD, que será definida como GET ou POST. Se for definido como POST, o comprimento das informações codificadas é armazenado na variável de ambiente CONTENT_LENGTH.

Entrada Codificada

Quando um usuário envia um formulário, o navegador primeiro codifica as informações antes de enviá-las ao servidor e depois ao aplicativo CGI. Quando você usa a etiqueta , cada campo recebe um nome simbólico. O valor digitado pelo usuário é representado como o valor da variável.

Para determinar isso, o navegador usa uma especificação de codificação de URL, que pode ser descrita da seguinte forma:

  • Separa campos diferentes com um e comercial (&).
  • Separa o nome e os valores com sinais de igual (=), com o nome à esquerda e o valor à direita.
  • Substitui os espaços por sinais de adição (+).
  • Substitui todos os caracteres "anormais" por um sinal de porcentagem (%) seguido por um código de caractere hexadecimal de dois dígitos.

Sua string final codificada ficará assim:

Nome1=valor1&nome2=valor2&nome3=valor3 ...

Nota: As especificações para codificação de URL estão em RFC1738.

Por exemplo, digamos que você tenha um formulário que solicita um nome e idade. O código HTML que foi usado para exibir este formulário é mostrado na Listagem 2.5.

Listagem 2.5. O código HTML para exibir o formulário de nome e idade.

nome e idade

Digite seu nome:

Digite sua idade:

Suponha que o usuário insira Joe Schmoe no campo de nome e 20 no campo de idade. A entrada será codificada na string de entrada.

Nome=Joe+Schmoe&idade=20

Análise de entrada

Para que essas informações sejam úteis, você precisa usar as informações em algo que possa ser usado por seus programas CGI. As estratégias de análise de entrada são abordadas no Capítulo 5. Na prática, você nunca precisa pensar em como analisar a entrada, porque várias pessoas já escreveram bibliotecas publicamente disponíveis que fazem análise. Duas dessas bibliotecas são apresentadas neste capítulo nas seguintes seções: cgi-lib.pl para Perl (escrito por Steve Brenner) e cgihtml para C (escrito por mim).

O objetivo geral da maioria das bibliotecas escritas em várias linguagens é analisar uma string codificada e colocar pares de nome e valor em uma estrutura de dados. Existe uma vantagem óbvia em usar uma linguagem que possui estruturas de dados embutidas como Perl; no entanto, a maioria das bibliotecas para linguagens de nível inferior, como C e C++, inclui a execução de uma estrutura de dados e uma sub-rotina.

Não é necessário obter um entendimento completo das bibliotecas; é muito mais importante aprender a usá-los como ferramentas para facilitar o trabalho do programador CGI.

cgi-lib.pl

Cgi-lib.pl usa matrizes associativas do Perl. A função &ReadParse analisa a string de entrada e insere cada par nome/valor por nome. Por exemplo, as strings Perl correspondentes necessárias para decodificar a string de entrada "nome/idade" apresentada seriam

&ReadParse(*entrada);

Agora, para ver o valor inserido para "nome", você pode consultar a matriz associativa $input("nome"). Da mesma forma, para se referir ao valor "age", você precisa olhar para a variável $input("age").

cgihtml

C não possui nenhuma estrutura de dados embutida, então cgihtml implementa sua própria lista de links para uso com suas rotinas de análise CGI. Isso define a estrutura do tipo de entrada da seguinte maneira:

Typedef struct ( Char *nome; Char *valor; ) Tipo de entrada;

Para analisar a string de entrada "nome / idade" em C usando cgihtml, o seguinte é usado:

/* declara uma lista encadeada chamada input */ Llist input; /* analisa a entrada e coloca na lista encadeada */ read_cgi_input(&input);

Para acessar as informações de idade, você pode analisar a lista manualmente ou usar a função cgi _val() fornecida.

#incluir #incluir Char *idade = malloc (sizeof (char) * strlen (cgi _val (input, "idade")) + 1); Strcpy(idade, cgi_val(entrada, "idade"));

O valor "idade" agora está armazenado na string de idade.

Observação: em vez de usar uma matriz simples (como char age ;), estou alocando espaço de memória dinamicamente para a string age. Embora isso complique a programação, é importante do ponto de vista da segurança. Mais sobre isso no Capítulo 9.

Um programa CGI simples

Você está prestes a escrever um programa CGI chamado nameage.cgi que lida com o formulário "name/age". O processamento de dados (o que costumo chamar de "material intermediário") é mínimo. Nameage.cgi simplesmente decodifica a entrada e exibe o nome de usuário e a idade. Embora não seja particularmente útil para tal ferramenta, ele demonstra o aspecto mais crítico da programação CGI: entrada e saída.

Você usa o mesmo formulário descrito acima, chamando os campos "nome e idade". Não se preocupe com robustez e eficiência ainda; resolver o problema dado da maneira mais simples. As soluções Perl e C são mostradas nas Listagens 2.6 e 2.7, respectivamente.

Listagem 2.6. Nameage.cgi em Perl

#!/usr/local/bin/perl # nameage.cgi require "cgi-lib.pl" &ReadParse(*input); print "Tipo de conteúdo: text/html\r\n\r\n"; imprimir" \n";imprimir" nome e idade\n";imprimir"\n";imprimir" \n"; print "Olá, " . $input("nome") . ". Você tem\n"; print $input("idade") . " anos.

\n";imprimir" \n";

Listagem 2.7. nameage.cgi em C

/* nameage.cgi.c */ #include #include "cgi-lib.h" int main() ( llist input; read_cgi_input(&input); printf("Tipo de conteúdo: text/html\r\n\r\n"); printf(" \n"); printf(" nome e idade\n"); printf("\n"); printf(" \n"); printf("Olá, %s. Você tem\n",cgi_val(input,"nome")); printf("%s anos.

\n",cgi_val(input,"idade")); printf(" \n"); )

Observe que esses dois programas são quase equivalentes. Ambos contêm rotinas de análise que ocupam apenas uma linha e processam todas as entradas (graças às rotinas de biblioteca apropriadas). A saída é essencialmente uma versão modificada de seu programa principal Hello, World!.

Tente executar o programa preenchendo o formulário e clicando no botão Enviar.

Estratégia geral de programação

Agora você conhece todos os princípios básicos necessários para a programação CGI. Depois de entender como o CGI recebe as informações e como as envia de volta ao navegador, a qualidade real do produto final depende da sua capacidade geral de programação. Ou seja, quando você estiver programando CGI (ou qualquer coisa), tenha em mente as seguintes qualidades:

  • Simplicidade
  • Eficiência
  • Versatilidade

As duas primeiras qualidades são bastante comuns: tente tornar seu código o mais legível e eficiente possível. Versatilidade se aplica mais a programas CGI do que a outros aplicativos. Quando você começar a desenvolver seus próprios programas CGI, descobrirá que existem alguns aplicativos básicos que todos desejam fazer. Por exemplo, uma das tarefas mais comuns e óbvias de um programa CGI é processar um formulário e enviar por e-mail os resultados para um destinatário específico. Você pode ter vários formulários renderizados separados, cada um com um destinatário diferente. Em vez de escrever um programa CGI para cada formulário individual, você pode economizar tempo escrevendo um programa CGI mais geral que se encaixe em todos os formulários.

Ao cobrir todos os aspectos básicos do CGI, forneci a você informações suficientes para começar a programar em CGI. No entanto, para ser um desenvolvedor CGI eficaz, você precisa ter uma compreensão mais profunda de como o CGI se comunica com o servidor e o navegador. O restante deste livro discute em detalhes as questões brevemente mencionadas neste capítulo, bem como estratégias de desenvolvimento de aplicativos, vantagens e limitações do protocolo.

Resumo

Este capítulo abordou brevemente os fundamentos da programação CGI. Você cria a saída formatando corretamente seus dados e imprimindo em stdout. Obter entrada CGI é um pouco mais complicado porque deve ser analisado antes de ser usado. Felizmente, já existem várias bibliotecas que fazem a análise.

Até agora, você deve estar bastante confortável com a programação de aplicativos CGI. O restante deste livro é dedicado a uma apresentação mais detalhada da especificação, dicas e estratégias de programação para aplicativos mais avançados e complexos.