{"id":15018205,"url":"https://github.com/amgauna/perl-cgi-2019","last_synced_at":"2025-10-18T19:58:27.854Z","repository":{"id":117370116,"uuid":"88531033","full_name":"amgauna/PERL-CGI-2019","owner":"amgauna","description":"PERL / Scripts CGI-BIN","archived":false,"fork":false,"pushed_at":"2022-03-06T22:00:27.000Z","size":181,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-31T03:33:41.140Z","etag":null,"topics":["cgi","cgi-bin","cgi-script","perl","perl-module","perl-script","perl-scripts","perl5","perl6","script","scripting-language"],"latest_commit_sha":null,"homepage":"","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amgauna.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-04-17T17:12:45.000Z","updated_at":"2023-09-29T03:44:46.000Z","dependencies_parsed_at":"2023-07-03T17:45:44.359Z","dependency_job_id":null,"html_url":"https://github.com/amgauna/PERL-CGI-2019","commit_stats":null,"previous_names":["amgauna58rj/perl-cgi-exercicios","anagaunatech/perl-cgi-exercicios","anagaunadev/perl-cgi-exercicios","amgauna/perl-cgi-exercicios","amgauna/perl-cgi-2019"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/amgauna/PERL-CGI-2019","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amgauna%2FPERL-CGI-2019","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amgauna%2FPERL-CGI-2019/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amgauna%2FPERL-CGI-2019/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amgauna%2FPERL-CGI-2019/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amgauna","download_url":"https://codeload.github.com/amgauna/PERL-CGI-2019/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amgauna%2FPERL-CGI-2019/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279607413,"owners_count":26198789,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-18T02:00:06.492Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cgi","cgi-bin","cgi-script","perl","perl-module","perl-script","perl-scripts","perl5","perl6","script","scripting-language"],"created_at":"2024-09-24T19:51:39.402Z","updated_at":"2025-10-18T19:58:27.821Z","avatar_url":"https://github.com/amgauna.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PERL / CGI-BIN\n\n* Active PERL Instalação no Windows = https://www.activestate.com/activeperl\n* Tutorial PERL = https://www.tutorialspoint.com/perl/index.htm\n* Tutorial PERL = https://www.perltutorial.org/\n\n-------------------------------------------------\n\n# PERL - Instalação no Unix / Linux\n\n#### esta primeira e segunda linhas são apenas sugestões para instalação\n\nmkdir /usr/src/temp  \n\ncd /usr/src/temp\n\n\u003c/code\u003e\n\n#### copie neste diretório o arquivo stable.tar.gzip;\n\ngzip ´d stable.tar.gzip\n\ntar xvl stable.tar\n\ncd perl-5.6.0\n\nrm -f config.sh Policy.sh\n\nsh Configure -de\n\nmake\n\nmake test\n\nmake install\n\n----------------------------------------------------------\n\n# CGI / Common Gateway Interface\n\n-------------------------------------------------------------\n\nO que é CGI = https://homepages.dcc.ufmg.br/~mlbc/cursos/internet/cgi/intro.htm\n\nCGI Servindo páginas web (html) = http://devfuria.com.br/miscellaneous/cgi-common-gateway-interface/\n\nO que é CGI / Formatando formulários CGI = http://penta.ufrgs.br/edu/forms/cgi.html\n\nCGI Recursos Aançados em Java e JavaScript = http://penta.ufrgs.br/pesquisa/joice/cap4.html\n\nCGI Realmente Fácil / Escrevendo scripts CGI para processar formularios na Web = https://www.jmarshall.com/easy/cgi/portuguese/\n\nCGI - Common Gateway Interface = https://web.fe.up.pt/~goii2000/M9/cgi.htm\n\nIBM Environment variables in CGI script (reference) = https://www.ibm.com/docs/pt-br/netcoolomnibus/8.1?topic=SSSHTQ_8.1.0/com.ibm.netcool_OMNIbus.doc_8.1.0/webtop/wip/reference/web_cust_envvariablesincgiscripts.html\n\nCGI - Linguagem Tcl/Tk = http://www.c2o.pro.br/automacao/ar01s14.html\n\nCGI Formulários = http://penta.ufrgs.br/edu/forms/cgi.html\n\nCGI Tutorial = https://www.w3.org/CGI/\n\nCommon Gateway Interface (CGI) = https://en.wikipedia.org/wiki/Common_Gateway_Interface\n\nCGI (Wikipedia) = https://pt.wikipedia.org/wiki/CGI\n\nCGI Introdução = http://homepages.dcc.ufmg.br/~mlbc/cursos/internet/cgi/intro.htm\n\n-------------------------------------------------------------\n\nO que é o CGI(common gateway interface) e o que ele faz?\nCGI(Common Gateway Interface) é uma tecnologia que permite gerar páginas dinâmicas com interação entre scripts de Servidores HTTP com Gateway Scripts e Programas através de parâmetros. Sendo assim Scripts CGI são os pequenos programas que interpretam esses parâmetros e geram uma página depois de os processar.\n\nPorém o uso do CGI não é muito seguro, tendo em mente que é preciso tomar algumas precauções de seguranças. Logo abaixo será discutido sobre que precauções de segurança tomar baseado em algumas regras dos programas CGI após a explicação de como o CGI funciona.\n\nComo funciona?\nExemplo:\n\nO CLIENTE(Browser) solicita uma URL ao SERVIDOR\nA URL solicitada é referente a um CGI, portanto o SERVIDOR executa o CGI\no CGI trabalha interagindo com outras aplicações do sistema, recupera dados destas aplicações e retorna o resultado ao SERVIDOR\nO SERVIDOR envia os dados para o CLIENTE, que formata o resultado e apresenta ao usuário\ninserir a descrição da imagem aqui\n\nPara que usar CGI?\nCom o CGI, seu servidor pode acessar informações que não estão de uma forma legível para o cliente (ex. SQL database), e age como gateway entre ambos para produzir alguma coisa que o cliente possa usar. Gateways podem ser usadas para uma variedade de propositos, os mais comuns são manipulação de ISINDEX e requisição de formulário para HTTP.\n\nExemplos do uso de CGI:\nConverter páginas de manual de sistemas para HTML e enviar o resultado HTML para o cliente.\nFazer interface com WAIS e banco de dados archie, convertendo os resultados para HTML e enviando o resultado para o cliente.\nPermitir ao usuário realimentar seu servidor atraves de um formulário HTML e um decodificador acompanhando o CGI.\nVocê pode estar escrevendo estes CGI's através de gateways que podem ser escritos em qualquer liguagem que permita ser executado no sistema, tais como:\n\nC/C++\nFortran\nPerl\nTCL\nUnix Shell\nVisual Basic\nApple Script\nQuais são as principais regras dos programas CGI?\nProgramas CGI, ou scripts, são programas executáveis que podem ser executados por si mesmo (o que não é uma maneira segura). Portanto existem algumas precauções de segurança que necessitam ser implementadas quando utilizando programas CGI.\n\nAs principais regras são:\n\nO script CGI tem que estar em um lugar determinado pelo servidor para os scripts CGI ou tem que ter um sufixo especial, que o servidor está configurado para reconhecer como um script CGI legal.\nA maioria dos sistemas armazena scripts CGI em um diretório raiz do servidor HTTP, chamado cgi-bin, que é configurado de tal forma que, somente determinados usuários de confiança, possam gravar nele. Isto evita problemas óbvios de segurança, que surgem ao se permitir que usuários anônimos remotos executem qualquer coisa no sistema.\nExemplo: /usr/local/apache/htdocs/cgi-bin\n\nO script pode recolher seus parâmetros, da entrada padrão (via teclado), das variáveis de ambientes ou de ambas.\n\nO script deve dar como saída, um dos três tipos de cabeçalho padrão, como uma string de texto normal. Sendo os três tipos:\n\nCONTEXT_TYPE: O tipo de conteúdo se refere a qualquer tipo de dado MIME que seja aceito pelo servidor.\nOs tipos comuns incluem texto/html, texto/simples e dados/gif.\nComo o browser/servidor não pode deduzir este tipo de arquivo, a partir de uma localização ou sufixo de nome de arquivo, este título informará ao browser que tipo de dados esperar e como usá-lo.\n\nFormato: tipo/tipo\n\nLOCATION: Aponta para um documento em algum outro lugar do servidor.\nPermite que você redirecione pedidos para documentos, baseando-se em algum critério enviado por um formulário ou variável de ambiente.\n\nSTATUS: Pode ser usado para executar um script, sem enviar uma nova página para o cliente. Também pode ser usado para enviar uma mensagem de erro ou outra informaçao para o cliente.\n\nO script deve ser executável pelo usuário que o servidor tem configurado. (Existe um usuário especial chamado \"NOBODY\" que é o usuário padrão para a maioria dos servidores Web. Você deve se certificar de que o usuário \"NOBODY\" ou o usuário para o qual o seu servidor está configurado para trabalhar, tem permissão para executar os seus scripts e ler/escrever em quaisquer arquivos que o script possa usar).\n\nMais detalhes de Segurança em Scripts CGI\n\nComo obter informações do servidor?\nCada vez que um usuário solicita a URL correspondente ao seu programa CGI, o servidor irá executá-lo em tempo real. Um conceito errado sobre CGI é que você pode enviar linhas de comandos opcionais e argumentos para seu programa, tal como:\n\ncommand% myprog -qa blorf\n\nCGI utiliza a linha de comando para outros propositos. Gateway usa variaveis de ambiente para enviar ao programa seus parametros.\n\nComo enviar documentos para o usuário?\nProgramas CGI podem retornar um grande número de tipos de documentos. Podem retornar uma imagem ao usuário, um documento HTML, ou talvez um clip de áudio. Podem também referenciar outros documentos.\n\nO cliente necessita saber que tipo de documento receberá, para que possa apresentá-lo de maneira adequada. Logo o programa CGI deve informar ao servidor que tipo de documento está sendo enviado.\n\nDe forma a comunicar ao servidor o tipo de documento que está retornando, se é um documento completo ou uma referência para outro, CGI requer um pequeno cabeçalho na saída. Este cabeçalho é um texto ASCII, consistindo de linhas separadas ou por linefeeds ou por carriage returns (ou por ambos) seguidos de uma linha em branco.\n\nExemplo:\n\nUm documento completo com o tipo MIME correspondente.\nEnviando um documento HTML para o cliente.\n\nContent-type: text/html\n\n\u003chtml\u003e\n\u003chead\u003e\n    \u003ctitle\u003esaída HTML de um script CGI\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003ch1\u003eSaída de exemplo\u003c/h1\u003e\n    O que você acha \u003cstrong\u003edisso?\u003c/strong\u003e\n\u003c/body\u003e\n\u003c/html\u003e\nUma referência a outro documento.\n\nContent-type: text/html\nLocation: gopher://httprules.foobar.org/0\n\n\u003chtml\u003e\n\u003chead\u003e\n    \u003ctitle\u003eDesculpe...moveu-se\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003ch1\u003eIr para vez do Gopher\u003c/h1\u003e\n    Agora disponível em\n    \u003ca href=\"gopher://httprules.foobar.org/0\"\u003euma nova localização\u003c/a\u003e no nosso servidor do Gopher.\n\u003c/body\u003e\n\u003c/html\u003e\nComo construir um formulário?\nUm formulário pode ser criado dentro de uma página html usando a tag FORM. Uma página pode conter vários formulários, mas os formulários não podem estar contidos uns nos outros.\n\n\u003cform method=\"Método GET ou POST\" action=\"A URL\"\u003e...\u003c/form\u003e\nOnde o ACTION é a URL do servidor que receberá os dados do formulário (isto é, é o endereço do programa CGI responsável pelo tratamento dos dados) e METHOD é a forma como os dados serão passados para o programa CGI.\n\nUm formulário pode conter vários componentes, como inputs, check boxes e radio.\n\nComo obter os dados do formulário?\nExistem dois métodos que podem ser usados para acessar os formulários, GET e POST. Dependendo do método utilizado, você receberá os dados de maneira diferente.\n\nO método GET: Se o seu formulário usa method=\"GET\", seu programa CGI receberá os dados codificados na variável de ambiente QUERY_STRING.\nExemplo:\n\n\u003cform method=\"GET\" action=\"get-query.cgi\"\u003e\n    Login: \u003cinput type=\"text\" name=\"login\" /\u003e\n    Senha: \u003cinput type=\"text\" name=\"senha\" /\u003e\n    \u003cinput type=\"submit\" value=\"Enviar\" /\u003e\n\u003c/form\u003e\n\nO método POST: Se o seu formulário usa method=\"POST\", seu programa CGI receberá os dados da entrada padrão stdin. O servidor NÃO enviará um EOF ao término dos dados. Ao invés disso você terá que usar a variável de ambiente CONTENT_LENGTH para determinar a quantidade de dados a serem lidos de stdin.\n\nExemplo:\n\n\u003cform method=\"POST\" action=\"post-query.cgi\"\u003e\n    Login: \u003cinput type=\"text\" name=\"login\" /\u003e\n    Senha: \u003cinput type=\"text\" name=\"senha\" /\u003e\n    \u003cinput type=\"submit\" value=\"Enviar\" /\u003e\n\u003c/form\u003e\n\nComo fazer para ler uma variável de ambiente dependerá do Sistema Operacional em que o programa CGI será executado e da linguagem de programação em que foi escrito. Um programa C rodando em UNIX pode usar a função char *getenv(const char *name); que recebe o nome da variável como argumento e retorna o seu valor em um string.\n\nÉ uma tecnologia antiga?\nO CGI foi concebido como o culminar de discussões por especialistas durante os primórdios da Internet, em 1993 pela NSCA(National Center for Supercomputing Applications) nomeadamente entre Rob McCool, John Franks, Ari Luotonen, George Phillips e Tony Sanders. O que pode fazer dela ser considerada uma tecnologia antiga.\n\nEspecificação do CGI 1.1: RFC3875\n\nEmbora a linguagem tipicamente associada aos CGI seja o Perl, o CGI foi concebido de forma a ser independente da linguagem utilizada. Atualmente tecnologias como ASP.NET, PHP, Python e Ruby continuam a utilizar a especificação.\n\nExistem outras alternativas a ele(quais)?\nFastCGI: É um protocolo binário para interação de interfaces de programas com um Servidor Web.\n\nPSGI: É uma interface entre servidores web e Aplicações web PERL e Frameworks que permite escrever aplicações que podem ser executados como servidores autônomos ou usando o CGI.\nRack: Fornece uma interface modular e adaptável para o desenvolvimento de aplicações web em Ruby.\n\nWRB: Tecnologia de servidor HTTP similar ao CGI distribuído pela Oracle.\n\n\n-------------------------------------------------------------\n\n# CGI (sigla em inglês para Common Gateway Interface), em português, Interface Comum de Porta de entrada.\n\nInterface: elemento que proporciona uma ligação física ou lógica entre dois sistemas ou partes de um sistema que não poderiam ser conectados diretamente.\n\nVisão Geral\ninserir a descrição da imagem aqui\n\nGeralmente, o servidor HTTP tem um diretório (pasta), que é designado como uma coleção de documentos(arquivos), que podem ser enviados para navegadores da Web ligados a este servidor. Por exemplo, se o servidor Web tem o nome de domínio exemplo.com , e sua coleção de documentos é armazenado em /usr/local/apache/htdocs no sistema de arquivos local, em seguida, o servidor web irá responder a um pedido de http://exemplo.com/index.html enviando para o navegador o arquivo /usr/local/apache/htdocs/index.html.\n\nCGI estende esse sistema, permitindo ao proprietário do servidor Web designar um diretório dentro da coleção de documento contendo scripts executáveis ​​(ou arquivos binários) em vez de páginas pré-escritas, isto é conhecido como um diretório CGI. Por exemplo, /usr/local/apache/htdocs/cgi-bin poderia ser designado como um diretório CGI no servidor Web. Se um navegador da Web solicita a URL que aponta para um arquivo dentro do diretório CGI (por exemplo, http://exemplo.com/cgi-bin/printenv.pl), em vez de simplesmente enviar o arquivo ( /usr/local/apache/htdocs/cgi-bin/printenv.pl) para o navegador web, o servidor HTTP executa o script especificado e passa a saída do script para o navegador da web. Ou seja, qualquer coisa que o script envia a saída padrão é passado para o cliente Web em vez de ser mostrado na tela em uma janela de terminal.\n\nEstrutura geral de scripts CGI:\nLeitura e descodificação de dados (e/ou campos de informação de um pacote HTTP);\n\nProcessamento dos dados (gravar informação em bases de dados,\nrealizar cálculos, recuperar dados);\n\nCriação de uma página Web com os resultados produzidos.\n\nExemplos de aplicação de CGI's\nProcessamento de dados submetidos através de formulários;\n\nServir de interface com a bases de dados, fazendo a conversão da\ntransação de HTML para SQL e formatar em HTML as respostas obtidas,\nenviando em seguida os resultados para o cliente;\n\nConverter dados do sistema para HTML e retornar o resultado para o\ncliente;\n\nCriação de documentos personalizados;\n\nGerir contadores de acesso;\n\nProcessamento de mapas.\n\nMétodos de transmissão\nO protocolo HTTP, utiliza vários métodos de manipulação e organização dos dados. Os dois métodos mais utilizados para submeter dados de formulários são o GET e o POST. Ambos os métodos transferem dados do browser para o servidor, a maior diferença entre eles é a maneira como a informação é passada para o programa CGI:\n\nGET\n\nCGI chamada através do método GET\n\nO browser acrescenta um \"?\" ao URL especificado no atributo ACTION, e os valores codificados;\n\nhttp://exemplo.com/cgi-bin/registra.pl?login=guest \n\nO servidor ao receber um URL com uma query-string, chama o programa cgi identificado na 1ª parte do URL (antes do '?') e guarda a parte depois do '?' na variável de ambiente QUERY_STRING (a string de consultas contida na URL após o '?') . Supondo que o utilizador digitou \"guest\" no campo login, quando o botão submit é clicado, o browser envia, ao servidor.\n\nO pedido GET identifica o documento a enviar (cgi-bin/registra.pl). Desde que o servidor esteja configurado para reconhecer todos os ficheiros no diretório cgi-bin como sendo um programa cgi, executa o programa em vez de enviar o documento diretamente ao browser, além disso coloca a string login='guest' na variável de ambiente QUERY_STRING.\n\nO programador de CGI's não consegue controlar por qual método o programa vai ser chamado. Assim os scripts são geralmente escritos para suportar ambos os métodos.\n\n\nOs dados introduzidos em um formulário fazem parte do corpo da mensagem enviada para o servidor.\n\nEnquanto o método GET passa a informação através de variáveis de ambiente , o POST envia os dados para o programa CGI através do standard input (entrada padrão,stdio.h), como uma string de comprimento especificado na variável de ambiente CONTENT_LENGTH;\n\nFaz 2 ligações ao servidor, uma para contactar o servidor e outra para enviar os parâmetros. Em outras palavras, se o servidor receber um pedido de um formulário usando o POST, ele sabe que tem que continuar \"à espera\" do resto da informação.\n\nVantagens/Desvantagens\n\nA vantagem do GET é que permite aceder ao programa CGI com uma query sem utilizar um formulário, basicamente estamos a passar parâmetros para um programa. Exemplo: \u003cA HREF=\"/cgi-bin/program.pl?user=Larry%20Bird\u0026age=35\u0026pass=testing\"\u003e Programa CGI \u003c/A\u003e\n\nA maior desvantagem do GET é a falta de segurança e o facto de ter de haver algum cuidado para que o browser ou o servidor não trunquem a informação que exceda o número de caracteres permitido.\n\nA maior vantagem do método POST é o tamanho da query poder ser ilimitada. Para obter informação através do método POST, o programa CGI lê do standard input, por essa razão não é possivel aceder à CGI sem utilizar um formulário.\n\nHistória\nLevando em conta a velocidade com a qual as inovações acontecem, CGI pode ser considerado antigo, levando em consideração a criação do computador pode se dizer que está na meia-idade.\n\nEm 1993, a equipe o National Center for Supercomputing Applications (NCSA),escreveu uma especificação para chamar executáveis ​​de linha de comando na www-talk lista de emails. No entanto, NCSA não hospeda a especificação.\n\nOutros desenvolvedores adotaram a especificação, e tem sido um padrão para servidores web desde então. Um grupo presidido por Ken Coar começou em novembro de 1997 um trabalho para obter a definição NCSA de CGI mais formalmente definida. Este trabalho resultou em RFC3875 , que especifica a versão CGI 1.1. Expressamente mencionados na RFC são os contribuintes que se segue:\n\nRob McCool (autor do NCSA HTTPd Web Server ) John Franks (autor do Web Server GN) Ari Luotonen (o desenvolvedor do CERN httpd servidor Web) Tony Sanders (autor do servidor Plexus Web) George Phillips (mantenedor do servidor Web na University of British Columbia ).\n\nComo alternativa pode considerar:\n\nFastCGI\n\nPSGI(Perl Web Server Gateway Interface)\n\nRack (web server interface)\n\nWSGI(Web Server Gateway Interface)\n\nExemplo simples de um script CGI\n\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n \u003cbody\u003e\n  \u003cform action=\"add.cgi\" method=\"POST\"\u003e\n   Coloque os dois números:\u003cbr /\u003e\n   Primeiro número: \u003cinput type=\"text\" name=\"num1\" /\u003e\u003cbr /\u003e\n   Segundo número: \u003cinput type=\"text\" name=\"num2\" /\u003e\u003cbr /\u003e\n   \u003cinput type=\"submit\" value=\"Enviar\" /\u003e\n  \u003c/form\u003e\n \u003c/body\u003e\n\u003c/html\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famgauna%2Fperl-cgi-2019","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famgauna%2Fperl-cgi-2019","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famgauna%2Fperl-cgi-2019/lists"}