O que é CGI
O CGI é atualmente mantido pela NCSA, que define o CGI da seguinte forma:
CGI (Common Gateway Interface), Common Gateway Interface, é um programa que roda em um servidor como um servidor HTTP e fornece uma interface com a página HTML do cliente.
navegação na web
Para entender melhor como funciona o CGI, podemos começar clicando em um link ou URL em uma página da web:
1. Use seu navegador para acessar o URL e conectar-se ao servidor web HTTP.
2. Após receber as informações da solicitação, o servidor web irá analisar a URL e verificar se o arquivo acessado existe no servidor. Se o arquivo existir, ele retornará o conteúdo do arquivo, caso contrário retornará uma mensagem de erro.
3. O navegador recebe informações do servidor e exibe o arquivo recebido ou mensagem de erro.
Os programas CGI podem ser scripts Python, scripts PERL, scripts SHELL, programas C ou C++, etc.
Diagrama de arquitetura CGI
Suporte e configuração de servidor web
Antes de executar a programação CGI, certifique-se de que seu servidor web suporte CGI e tenha configurado um manipulador CGI.
Apache suporta configuração CGI:
Configure o diretório CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Todos os programas CGI de execução do servidor HTTP são salvos em um diretório pré-configurado. Este diretório é chamado de diretório CGI e, por convenção, é denominado /var/www/cgi-bin.
Os arquivos CGI têm uma extensão .cgi e Perl também pode usar uma extensão .pl.
Por padrão, a configuração do servidor Linux é executada no diretório cgi-bin em /var/www.
Se quiser especificar outro diretório para executar scripts CGI, você pode modificar o arquivo de configuração httpd.conf da seguinte forma:
<Diretório "/var/www/cgi-bin"> AllowOverride None Opções +ExecCGI Ordem permitir, negar Permitir de todos</Diretório>
Adicione o sufixo .pl ao AddHandler para que possamos acessar os arquivos de script Perl que terminam em .pl:
AddHandler cgi-script .cgi .pl .py
O primeiro programa CGI
Abaixo criamos um arquivo test.cgi, o código é o seguinte:
código test.cgi
#!/usr/bin/perl imprimir " Tipo de conteúdo:texto/html r n r n " ; ' <html> ' ; imprimir ' <cabeça> ' ; imprimir ' <meta charset="utf-8"> ' ; imprimir ' <title>Tutorial
do codificador (codercto.com)</title> ' ; ' </head> ' ; imprimir ' <corpo> ' ; imprimir ' <h2>Olá Palavra </h2> ' ; ' <p>O primeiro programa CGI do Tutorial do Programador. </p> ' ; imprimir ' </body> ' ; imprimir ' </html> ' ; 1 ; Em seguida, abra http://localhost/cgi-bin/test.cgi através do navegador, os resultados de saída são os seguintes:
O conteúdo de saída da primeira linha do script "Content-type: text/htmlrnrn" é enviado ao navegador e informa ao navegador que o tipo de conteúdo exibido é "text/html".
Cabeçalho HTTP
O "Content-type:text/html" no conteúdo do arquivo test.cgi faz parte do cabeçalho HTTP, que é enviado ao navegador para informar ao navegador o tipo de conteúdo do arquivo.
O formato do cabeçalho HTTP é o seguinte:
Nome do campo HTTP: conteúdo do campo
Por exemplo:
Tipo de conteúdo:text/htmlrnrn
A tabela a seguir apresenta informações comumente usadas em cabeçalhos HTTP em programas CGI:
cabeça | descrever |
---|
Tipo de conteúdo: | As informações MIME solicitadas correspondentes à entidade. Por exemplo: Tipo de conteúdo:texto/html |
Expira em: Data | Data e hora de expiração da resposta |
Localização: URL | Usado para redirecionar o destinatário ao local de uma URL não solicitada para concluir a solicitação ou identificar um novo recurso. |
Última modificação: Data | A hora da última modificação do recurso solicitado |
Comprimento do conteúdo: N | Comprimento do conteúdo solicitado |
Set-Cookie: String | Definir cookie HTTP |
Variáveis de ambiente CGI
Todos os programas CGI recebem as seguintes variáveis de ambiente, que desempenham um papel importante nos programas CGI:
nome da variável | descrever |
---|
CONTENT_TYPE | O valor desta variável de ambiente indica o tipo MIME da informação que está sendo passada. Atualmente, a variável de ambiente CONTENT_TYPE é geralmente: application/x-www-form-urlencoded, o que indica que os dados vêm de formulários HTML. |
CONTENT_LENGTH | Se o método de transferência de informações entre o servidor e o programa CGI for POST, esta variável de ambiente será o número de bytes de dados válidos que podem ser lidos a partir da entrada padrão STDIN. Esta variável de ambiente deve ser usada ao ler os dados inseridos. |
HTTP_COOKIE | Conteúdo COOKIE no cliente. |
HTTP_USER_AGENT | Forneça informações do navegador do cliente, incluindo números de versão ou outros dados proprietários. |
PATH_INFO | O valor desta variável de ambiente representa outras informações de caminho imediatamente após o nome do programa CGI. Muitas vezes aparece como um parâmetro para programas CGI. |
QUERY_STRING | Se o método de transferência de informações entre o servidor e o programa CGI for GET, o valor desta variável de ambiente será a informação transferida. Esta informação segue o nome do programa CGI, separada por um ponto de interrogação '?'. |
REMOTE_ADDR | O valor desta variável de ambiente é o endereço IP do cliente que envia a solicitação, como 192.168.1.67 acima. Este valor está sempre presente. E é o identificador exclusivo que o cliente Web precisa fornecer ao servidor Web, que pode ser usado em programas CGI para distinguir diferentes clientes Web. |
REMOTE_HOST | O valor desta variável de ambiente contém o nome do host do cliente que enviou a solicitação CGI. Se a consulta que você deseja consultar não for suportada, não será necessário definir essa variável de ambiente. |
REQUEST_METHOD | Fornece o método pelo qual o script é chamado. Para scripts que usam o protocolo HTTP/1.0, apenas GET e POST são significativos. |
SCRIPT_FILENAME | Caminho completo para o script CGI |
SCRIPT_NAME | O nome do script CGI |
SERVER_NAME | Este é o nome do host, alias ou endereço IP do seu servidor WEB. |
SERVIDOR_SOFTWARE | O valor desta variável de ambiente contém o nome e o número da versão do servidor HTTP que chama o programa CGI. Por exemplo, o valor acima é Apache/2.2.14(Unix) |
A seguir está um script CGI simples que gera variáveis de ambiente CGI:
Exemplo
#!/usr/bin/perl imprimir " Tipo de conteúdo: texto/html n n " ; ' <meta charset="utf-8"> ' ; imprimir " <font size=+1>Variável de ambiente:</font> n " ; ( organizar chaves %ENV ) { imprimir " <b> $_ </b>: $ENV { $_ } <br> n " } 1 ; Download de arquivo
Se quisermos baixar arquivos através de Perl CGI, precisamos definir diferentes informações de cabeçalho, conforme mostrado abaixo:
Exemplo
#!/usr/bin/perl # Cabeçalho HTTP imprimir " Content-
Type :application/octet-stream; name= " NomeArquivo " r n " ; " Content-Disposition: attachment; filename= " FileName " r n n " ; abrir ( ARQUIVO , " <NomeArquivo " ) ; while ( ler ( ARQUIVO , $buffer , 100 ) ) { imprimir ( " $ buffer " ) ; Transferir dados usando o método GET
O método GET envia as informações codificadas do usuário para o servidor. As informações dos dados são incluídas na URL da página solicitada, separadas por "?", conforme mostrado abaixo:
http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
Algumas notas adicionais sobre solicitações GET:
Solicitações GET podem ser armazenadas em cache
As solicitações GET permanecem no histórico do navegador
Solicitações GET podem ser marcadas
Solicitações GET não devem ser usadas ao lidar com dados confidenciais
Solicitações GET têm limites de comprimento
Solicitações GET devem ser usadas apenas para recuperar dados
Exemplo de URL simples: método GET
A seguir está uma URL simples que usa o método GET para enviar dois parâmetros ao programa test.cgi:
/cgi-bin/test.cgi?name=Tutorial do codificador&url=http://www.codercto.com
A seguir está o código do arquivo test.cgi:
Exemplo
#!/usr/bin/perl local ( $buffer , @pairs , $pair , $name , $value , % FORM ) ; $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' REQUEST_METHOD ' } equação " PEGAR " ) { $ buffer = $ENV { ' QUERY_STRING ' } } # Ler informações do par nome/valor @pares = divisão ( /&/, $ buffer ) ; $par ( @pares ) { ( $nome , $valor ) = split ( /=/, $par ) ; $valor =~ tr /+/ / ; $valor =~ s / % ( .. ) / pack ( " C " , hex ( $ 1 ) ) / por exemplo ; $FORM { $nome } = $valor } ; $nome = $FORM { nome } ; $url = $ FORM { url } ; " Tipo de conteúdo:texto/html r n r n " ; " <html> " ; imprimir " <cabeça> " ; imprimir ' <meta charset="utf-8"> ' ; imprimir ' <title>Tutorial
do codificador (codercto.com)</title> ' ; " </head> " ; imprimir " <corpo> " ; imprimir " <h2> $nome URL: $ url </h2> " ; " </body> " ; imprimir " </html> " ; 1 ; Verifique o navegador e a saída é a seguinte:
Exemplo de formulário simples: método GET
A seguir está um formulário HTML que usa o método GET para enviar dois dados ao servidor. O script do servidor enviado também é o arquivo test.cgi. O código test.html é o seguinte:
código do arquivo test.html
< ! HTML > <html> <cabeça> < meta conjunto de caracteres = " utf-8 " > <title> Tutorial do codificador ( codercto.com ) </title> </ cabeça > <corpo> < formulário ação = " /cgi-bin/test.cgi " método = " get " > nome do site: < input tipo = " texto " nome = " nome " > < br /> URL do site: < entrada tipo = " texto " nome = " url " /> < entrada tipo = " enviar " valor = " enviar " /> </form> </body> </html> No navegador, o efeito de execução é o seguinte:
Passar dados usando o método POST
É mais seguro e confiável usar o método POST para transmitir dados ao servidor. Algumas informações confidenciais, como senhas de usuários, precisam usar POST para transmitir dados.
O seguinte também é test.cgi, que também pode lidar com dados do formulário POST enviados pelo navegador:
código test.cgi
#!/usr/bin/perl local ( $buffer , @pairs , $pair , $name , $value , % FORM ) ; $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' REQUEST_METHOD ' } equação " PUBLICAR " ) { leia ( STDIN , $buffer , $ENV { ' CONTENT_LENGTH ' } ) } else ; { $ buffer = $ENV { ' QUERY_STRING ' } } # Ler informações do par nome/valor @pares = divisão ( /&/, $ buffer ) ; $par ( @pares ) { ( $nome , $valor ) = split ( /=/, $par ) ; $valor =~ tr /+/ / ; $valor =~ s / % ( .. ) / pack ( " C " , hex ( $ 1 ) ) / por exemplo ; $FORM { $nome } = $valor } ; $nome = $FORM { nome } ; $url = $ FORM { url } ; " Tipo de conteúdo:texto/html r n r n " ; " <html> " ; imprimir " <cabeça> " ; imprimir ' <meta charset="utf-8"> ' ; imprimir ' <title>Tutorial
do codificador (codercto.com)</title> ' ; " </head> " ; imprimir " <corpo> " ; imprimir " <h2> $nome URL: $ url </h2> " ; " </body> " ; imprimir " </html> " ; 1 ; A seguir está um formulário HTML que usa o método GET para enviar dois dados ao servidor. O script do servidor enviado também é o arquivo test.cgi. O código test.html é o seguinte:
código test.html
< ! HTML > <html> <cabeça> < meta conjunto de caracteres = " utf-8 " > <title> Tutorial do codificador ( codercto.com ) </title> </ cabeça > <corpo> < formulário ação = " /cgi-bin/test.cgi " método = " post " > Nome do site: < input tipo = " texto " nome = " nome " > < br /> URL do site: < entrada tipo = " texto " nome = " url " /> < entrada tipo = " enviar " valor = " enviar " /> </form> </body> </html> No navegador, o efeito de execução é o seguinte:
Passar dados da caixa de seleção através do programa CGI
A caixa de seleção é usada para enviar um ou mais dados de opção. O código test.html é o seguinte:
código test.html
< ! HTML > <html> <cabeça> < meta conjunto de caracteres = " utf-8 " > <title> Tutorial do codificador ( codercto.com ) </title> </ cabeça > <corpo> < formulário ação = " /cgi-bin/test.cgi " método = " POSTAR " alvo = " _blank " > < entrada tipo = " caixa de seleção " nome = " codercto " valor = " ligado " /> Tutorial do codificador < entrada tipo = " caixa de seleção " nome = " google " valor = " ligado " /> Google < entrada tipo = " enviar " valor = " Selecionar site " /> </form> </body> </html> A seguir está o código do arquivo test.cgi:
código test.cgi
#!/usr/bin/perl local ( $buffer , @pairs , $pair , $name , $value , % FORM ) ; $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' REQUEST_METHOD ' } equação " PUBLICAR " ) { leia ( STDIN , $buffer , $ENV { ' CONTENT_LENGTH ' } ) } else ; { $ buffer = $ENV { ' QUERY_STRING ' } } # Ler informações do par nome/valor @pares = divisão ( /&/, $ buffer ) ; $par ( @pares ) { ( $nome , $valor ) = split ( /=/, $par ) ; $valor =~ tr /+/ / ; $valor =~ s / % ( .. ) / pack ( " C " , hex ( $1 ) ) / por exemplo ; $FORM { $nome } = $valor } se ( $FORM { coderto } ) { $ codercto_flag = " ON " } else { $ codercto_flag = " DESLIGADO " } se ( $FORM { google } ) { $ google_flag = " ATIVADO " } else { $ google_flag = " DESLIGADO " } imprimir " Tipo de conteúdo:texto/html r n r n " ; " <html> " ; imprimir " <cabeça> " ; imprimir ' <meta charset="utf-8"> ' ; imprimir ' <title>Tutorial
do codificador (codercto.com)</title> ' ; " </head> " ; imprimir " <corpo> " ; imprimir " <h2> Status
selecionado do tutorial do codificador: $codercto_flag </h2> " ; " <h2> Status de seleção do Google: $ google_flag </h2> " ; " </body> " ; imprimir " </html> " ; 1 ; No navegador, o efeito de execução é o seguinte:
Passe dados de rádio através do programa CGI
O rádio passa apenas um dado para o servidor. O código test.html é o seguinte:
código test.html
< ! HTML > <html> <cabeça> < meta conjunto de caracteres = " utf-8 " > <title> Tutorial do codificador ( codercto.com ) </title> </ cabeça > <corpo> < formulário ação = " /cgi-bin/test.cgi " método = " postagem " alvo = " _blank " > < entrada tipo = " rádio " nome = " site " valor = " codercto " /> Tutorial do codificador < entrada tipo = " rádio " nome = " site " valor = " google " /> Google < entrada tipo = " enviar " valor = " enviar " /> </form> </corpo> </html> O código do script test.cgi é o seguinte:
código test.cgi
#!/usr/bin/perl local ( $buffer , @pairs , $pair , $name , $value , % FORM ) ; $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' REQUEST_METHOD ' } equação " PUBLICAR " ) { leia ( STDIN , $buffer , $ENV { ' CONTENT_LENGTH ' } ) } else ; { $ buffer = $ENV { ' QUERY_STRING ' } } # Ler informações do par nome/valor @pares = divisão ( /&/, $ buffer ) ; $par ( @pares ) { ( $nome , $valor ) = split ( /=/, $par ) ; $valor =~ tr /+/ / ; $valor =~ s / % ( .. ) / pack ( " C " , hex ( $ 1 ) ) / por exemplo ; $FORM { $nome } = $valor } $ site = $FORM { site } ; " Tipo de conteúdo:texto/html r n r n " ; " <html> " ; imprimir " <cabeça> " ; imprimir ' <meta charset="utf-8"> ' ; imprimir ' <title>Tutorial
do codificador (codercto.com)</title> ' ; " </head> " ; imprimir " <corpo> " ; imprimir " <h2> Site selecionado $ site </h2> " ; " </body> " ; imprimir " </html> " ; 1 ; No navegador, o efeito de execução é o seguinte:
Passe dados Textarea através do programa CGI
Textarea transmite várias linhas de dados para o servidor. O código test.html é o seguinte:
código test.html
< ! HTML > <html> <cabeça> < meta conjunto de caracteres = " utf-8 " > <title> Tutorial do codificador ( codercto.com ) </title> </ cabeça > <corpo> < formulário ação = " /cgi-bin/test.cgi " método = " postagem " alvo = " _blank " > < área de texto nome = " textoconteúdo " cols = " 40 " rows = " 4 " > Insira o conteúdo aqui... </ textarea > < entrada tipo = " enviar " valor = " enviar " /> </form> </body> </html> O código do script test.cgi é o seguinte:
código test.cgi
#!/usr/bin/perl local ( $buffer , @pairs , $pair , $name , $value , % FORM ) ; $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' REQUEST_METHOD ' } equação " PUBLICAR " ) { leia ( STDIN , $buffer , $ENV { ' CONTENT_LENGTH ' } ) } else ; { $ buffer = $ENV { ' QUERY_STRING ' } } # Ler informações do par nome/valor @pares = divisão ( /&/, $ buffer ) ; $par ( @pares ) { ( $nome , $valor ) = split ( /=/, $par ) ; $valor =~ tr /+/ / ; $valor =~ s / % ( .. ) / pack ( " C " , hex ( $ 1 ) ) / por exemplo ; $FORM { $nome } = $valor } $text_content = $ FORM { textcontent } ; " Tipo de conteúdo:texto/html r n r n " ; " <html> " ; imprimir " <cabeça> " ; imprimir ' <meta charset="utf-8"> ' ; imprimir ' <title>Tutorial
do codificador (codercto.com)</title> ' ; " </head> " ; imprimir " <corpo> " ; imprimir " <h2>
O conteúdo do texto de entrada é: $text_content </h2> " ; " </body> " ; imprimir " </html> " ; 1 ; No navegador, o efeito de execução é o seguinte:
Passe dados suspensos através do programa CGI
O código da caixa suspensa HTML é o seguinte:
código test.html
< ! HTML > <html> <cabeça> < meta conjunto de caracteres = " utf-8 " > <title> Tutorial do codificador ( codercto.com ) </title> </ cabeça > <corpo> < formulário ação = " /cgi-bin/test.cgi " método = " postagem " alvo = " _blank " > < selecione nome = " menu suspenso " > < opção valor = " codercto " selecionado > Tutorial do codificador </ opção > < opção valor = " google " > Google </ opção > </select> < entrada tipo = " enviar " valor = " enviar " /> </form> </corpo> </html> O código do script test.cgi é o seguinte:
código test.cgi
#!/usr/bin/perl local ( $buffer , @pairs , $pair , $name , $value , % FORM ) ; $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' REQUEST_METHOD ' } equação " PUBLICAR " ) { leia ( STDIN , $buffer , $ENV { ' CONTENT_LENGTH ' } ) } else ; { $ buffer = $ENV { ' QUERY_STRING ' } } # Ler informações do par nome/valor @pares = divisão ( /&/, $ buffer ) ; $par ( @pares ) { ( $nome , $valor ) = split ( /=/, $par ) ; $valor =~ tr /+/ / ; $valor =~ s / % ( .. ) / pack ( " C " , hex ( $ 1 ) ) / por exemplo ; $FORM { $nome } = $valor } $ site = $FORM { suspenso } ; " Tipo de conteúdo:texto/html r n r n " ; " <html> " ; imprimir " <cabeça> " ; imprimir ' <meta charset="utf-8"> ' ; imprimir ' <title>Tutorial
do codificador (codercto.com)</title> ' ; " </head> " ; imprimir " <corpo> " ; imprimir " <h2>O site
selecionado é: $site </h2> " ; " </body> " ; imprimir " </html> " ; 1 ; No navegador, o efeito de execução é o seguinte:
Uso de cookies em CGI
Uma grande deficiência do protocolo http é que ele não julga a identidade do usuário, o que traz grandes transtornos aos programadores. O surgimento da função cookie compensa essa deficiência.
Os cookies gravam dados de registro no disco rígido do cliente por meio do navegador do cliente quando o cliente acessa o script. As informações dos dados são recuperadas na próxima vez que o cliente acessa o script, atingindo assim a função de discriminação de identidade. Os cookies são frequentemente usados na verificação de identidade.
Sintaxe de cookies
O envio de cookies http é implementado através de cabeçalhos http, que são anteriores à transferência de arquivos. A sintaxe do cabeçalho set-cookie é a seguinte:
Set-cookie:nome=nome;expira=data;caminho=caminho;domínio=domínio;seguro
name=name: O valor do cookie precisa ser definido (name não pode usar " ; " e " , "). Use " ; " para separar vários valores de nome, por exemplo: name1=name1;name2=name2;name3=name3 .
expira=data: período de validade do cookie, formato: expira="Wdy,DD-Mon-YYYY HH:MM:SS"
path=path: Defina o caminho suportado pelos cookies. Se path for um caminho, o cookie terá efeito em todos os arquivos e subdiretórios neste diretório. Por exemplo: path="/cgi-bin/". o cookie terá efeito. Refere-se a entrar em vigor neste arquivo, por exemplo: path="/cgi-bin/cookie.cgi".
domínio=domínio: O nome de domínio efetivo para cookies, por exemplo: domínio="www.codercto.com"
seguro: Se este sinalizador for fornecido, significa que o cookie só pode ser passado através de um servidor https com protocolo SSL.
O recebimento de cookies é feito definindo a variável de ambiente HTTP_COOKIE. Os programas CGI podem obter informações de cookies recuperando esta variável.
Configurações de cookies
A configuração do cookie é muito simples, o cookie será enviado separadamente no cabeçalho http. O exemplo a seguir define UserID, Password e expira em cookies:
Exemplo
#!/usr/bin/perl imprimir " Set-Cookie:
UserID =XYZ; n " ; " Set
- Cookie:Senha=XYZ123; n " ; " Set-Cookie:Expires=Terça-feira, 31-Dec-2017 23:12:40 GMT " ; n " ; print " Set - Cookie : Domain = www codercto ; n " ;print " Set - Cookie : Path =/ perl ; n " ;print " Tipo de conteúdo : text / html r n r n " ;.......Outro conteúdo HTML Encontre biscoitos
A página de recuperação de informações de cookies é muito simples. As informações de cookies são armazenadas na variável de ambiente CGI HTTP_COOKIE.
Exemplo
#!/usr/bin/perl $ rcvd_cookies = $ ENV { ' HTTP_COOKIE ' } @cookies = dividir / / , $ rcvd_cookies ; $ biscoito ( @cookies ) { ( $key , $val ) = split ( /
= /, $cookie ) ; $ chave = ~ s / ^ s + // ; $ val = ~ s / ^ s + // ; /; se ( $chave equação " ID do usuário " ) { $user_id = $val ; elsif ( $ chave equação " Senha " ) { $senha = $ val } } imprimir " ID do usuário = $ user_id n " ; " Senha = $senha n " ; O resultado de saída do exemplo acima é:
ID do usuário = XYZSenha = XYZ123
Módulo CGI
Perl fornece muitos módulos CGI integrados, os dois seguintes são comumente usados:
Módulo CGI
Berkeley cgi-lib.pl