sábado, 3 de agosto de 2019

Começando com CGI em linguagem C

Introdução

Normalmente, quando se trata de programação web, muito se fala sobre linguagens como  PHP, Java, Node e Python, mas também é possível desenvolver em C ou Assembly, por exemplo.
Embora seja possível desenvolver páginas dinâmicas em praticamente qualquer linguagem, em algumas delas não é tão prático desenvolver tal dinamismo.  Usar a linguagem C traz algumas vantagens e desvantagens.

Vantagens

  • Desempenho: Linguagens compiladas são mais rápidas do que linguagens interpretadas (já que não precisam de uma máquina virtual).
  • Consumo de memória:  Por ser compilada consome menos memória, mas além disso, sem usar alocações dinâmicas e conhecendo bem o fluxo de execução, é possível determinar a quantidade de memória que será usada pelo programa.

Desvantagens

  •  Produtividade: Mais especificamente em C, como esta linguagem não foi pensada para o desenvolvimento de sistemas web, não possui algumas facilidades que trazem maior produtividade, como o tipo String; ter de interpretar strings para pegar os valores (esta parte ficará mais clara ao decorrer deste artigo).

Mas antes entender o que é e como funciona o CGI, é necessário aprender um pouco sobre como funciona a web (protocolo HTTP).

Sobre páginas na Internet

O Hypertext Transfer Protocol (HTTP) é o protocolo pelo qual a internet funciona. De modo simplificado o cliente (usuário / navegador) faz requisição a uma página e o servidores responde devolvendo a página requisitada.

Ilustração simplificada do que ocorre quando acessamos um site

Para criar uma simples página estática basta criar um arquivo com extensão .html (por exemplo minha_pagina.html) - caso queira aprender a criar páginas mais elaboradas o W3 Schools é altamente indicado, possui dicas sobre HTML, CSS e Javascript, por exemplo.


Abrindo o arquivo minha_pagina.html no navegador.

Um pouco mais sobre o protocolo HTTP

Ao acessar (fazer requisição) uma página na internet, algumas informações do lado cliente são enviadas ao lado servidor, como por exemplo, qual o navegador, sistema operacional, idioma, página requisitada e tipo de requisição. Para ver as informações estão sendo enviadas quando você acessa uma página, basta aperta a tecla F12 ou clicar com o botão direito do mouse e clicar em inspecionar elemento, em seguida acessar a aba Rede (network).

Estrutura de uma mensagem HTTP

Informações que são enviadas quando acessamos a página do Google
Observe que a mensagem é dividida em header (cabeçalho) e body (corpo) - isso será importante lá na frente.

Uma das formas para trazer dinamismo para uma página é utilizando formulários. Os formulários utilizam utilizam dois métodos para enviar os dados.

Método GET

Ao enviar dados usando o método GET, os valores dos campos são adicionados à URL, ou seja, os dados ficam visíveis no campo de endereço da página. Este método geralmente é usado em filtro de pesquisas.


Exibindo o formulário com método GET

Informações que são enviadas quando utilizado o método GET. Observe que aparece na URL o dado que digitei (1234), que fica no cabeçalho da requisição

Método POST

Ao enviar dados usando o método POST, os valores dos campos são colocados no corpo da mensagem. Este método geralmente é usando para enviar dados sensíveis, já que não fica exposto que nem o método GET.



Exibindo o formulário com método POST

Informações que são enviadas quando utilizado o método POST. Observe os dados não aparecem mais na URL, mas sim no Form Data, que fica no corpo da requisição

Sobre CGI

CGI (Common Gateway Interface) é um programa no lado servidor que envia ao cliente uma página HTML. É comumente usado para receber dados de formulários, mas pode ser usado para criar qualquer tipo de página dinâmica ou não.
Ilustração da comunicação do cliente com o servidor. Em seguida o servidor colocar as informações passadas pelo cliente em variáveis de ambiente. O programa pega os dados das variáveis de ambiente, processa e retorna algo (pode ser uma página ou não). O servidor pega o retorno do programa e repassa para o cliente


Antes de lidar com o dinamismo, vamos criar uma página estática.


Observe que colocamos a informação do cabeçalho de que tipo de mensagem estamos enviando e em seguida o HTML da página. É importante que após o cabeçalho haja a quebra de linha com dois \n. Podemos fazer um simples teste de executar o programa.

Saída no terminal do que é exibido pelo programa

Para transmitir informações do servidor ao programa, as informações são colocadas em variáveis de ambiente e o programa (a partir deste ponto irei me referir apenas por cgi). Algumas das variáveis de ambiente são:


Variável de AmbienteDescrição
CONTENT_TYPETipo de mídia
CONTENT_LENGTHTamanho do corpo
da mensagem
QUERY_STRINGParâmetros que estão sendo
enviados via URL
REQUEST_METHODTipo de método que está
sendo requisitado

Note que o que muda de um simples programa em C é que você também irá receber dados de variáveis de ambiente.

Para pegar dados das variáveis de ambiente é necessário usar a função getenv.


Para testar vamos ter de criar a variável de ambiente QUERY_STRING.



Criando variável de ambiente e logo em seguida executando o programa noWindows

Criando variável de ambiente e logo em seguida executando o programa no Linux


Note que você acabou de aprender como receber dados que são enviados pela URL, ou seja, acaba de aprender como receber dados que foram enviados usando o método GET.

Agora para receber dados que são enviados no corpo da mensagem, usaremos a variável de ambiente CONTENT_LENGTH para saber o tamanho do corpo da mensagem e faremos uma simples leitura do stdin (ou como comumente conhecido, leitura do teclado).

Criando variável de ambiente e logo em seguida executando o programa e por fim fazendo a leitura do teclado no Windows

Criando variável de ambiente e logo em seguida executando o programa e por fim fazendo a leitura do teclado no Linux


Note que você acabou de aprender como receber dados que foram enviados usando o método POST, pois o neste método coloca no CONTENT_LENGTH contém o tamanho do corpo da mensagem e o corpo da mensagem é enviado pelo stdin. Só lembre de colocar os dois \n antes de exibir devido ao fato já citade de servir para separar o cabeçalho do corpo da mensagem.

Usando o método POST e vendo o que é exibido
 



Agora, basta criar uma página com formulário, determinar o método de envio e a url de ação; e um CGI para lidar com os dados.


Formulário enviando dados ao CGI

CGI exibindo os dados recebidos via POST


Dados da requisição feita pelo formulário ao CGI

Observe que não foi necessária a instalação de nenhuma ferramenta (usamos apenas um compilador C) adicional para fazer nossos testes, mas para exibir o CGI no navegador é necessária a instalação de um servidor Web como Apache, não expliquei esse assunto por não ser o foco do artigo.

Caso queira ver um projeto usando CGI, tem um jogo da velha que criei um tempo atrás. E se quiser algo mais elaborado, como lidar com cookies e sessões veja as dúvidas frequentes.

Dúvidas frequentes


Pra que servem os as duas quebras de linhas (\n\n) no código? 
São essas quebras de linhas que separam o cabeçalho do corpo da mensagem e são de uso obrigatório. Para mais detalhes acesse a referência [4].

Para que serve o charset? 
Isso indica a codificação de caracteres. É indicado utilizar UTF-8 para que não haja nenhum problema.

O método GET é seguro?
"Não", pensando em passar dados sensíveis, como por exemplo senha ou tipo de previlégio, não é recomendado usar esse método, já que qualquer pessoa pode ver (também pessoas mal intencionadas que estejam monitorando a rede) e alterar os dados.

O método POST é seguro?
"Não", apesar de ser melhor que o GET, por não ficar tão escancarado, ainda não garante total segurança. Os dados só não estão mais visíveis, eles estão no corpo da mensagem. Para maior segurança, seria necessário usar o protocolo HTTPS, mas para estudar CGI não recomendo se preocupar com HTTPS de imediato.

O que muda de um programa qualquer escrito em C para os que utilizam CGI? 
A mudança é que você também irá receber dados de variáveis de ambiente.

Ao usar o método GET no envio de um formulário alguns caracteres estão estranhos, por que isso acontece?
Como os dados são colocados na URL, esses dados são codificados (URL encoding). Isso não acontece quando se usa o método POST.

Como posso criar sessão?
Você pode criar um arquivo no servidor com as credenciais dos usuários ( pode ser a identificação de do computador ou usuário) e as demais informações necessárias; e no lado cliente armazenar num cookie a credencial apenas, assim toda vez que o usuário acessar a página os cookies são enviados. Recomendo a leitura das referências [6] e [7].

Como testo o CGI no navegador?
Pra isso é necessário instalar um servidor web como o Apache e colocar os arquivos numa pasta específica. Assim você pode testar na sua própria máquina. Recomendo a leitura do artigo Habilitando CGI e .sh no Apache do Debian Jessie.



Referências:

[1] Programação WEB em C : Entendendo CGI
[2] O que é CGI e qual é sua finalidade?
[3] The Common Gateway Interface (CGI) Version 1.1
[4] Mensagens HTTP
[5] Getting Started with CGI Programming in C
[6] HOW-TO Write a CGI Program in C/C++
[7] How to handle session in CGI using c as same as we do in PHP

Nenhum comentário:

Postar um comentário