AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1117419
Accepted
QF0
QF0
Asked: 2022-12-07 11:06:54 +0800 CST2022-12-07 11:06:54 +0800 CST 2022-12-07 11:06:54 +0800 CST

Scripts CGI: quando você pode retornar um documento, em vez de uma resposta HTTP?

  • 772

O script 1 abaixo é bash e está em https://example.com/cgi-bin/test. Ele produz a saída 'Em construção' quando buscado. Ele ecoa Statuse Content-typecabeçalhos e alguns HTML. Se eu tentar ecoar um documento HTML inteiro, o Apache apenas reclamará de um cabeçalho inválido.

O script 2 abaixo é php e está em https://example.com/cgi-bin/test2.php. Ao contrário do script bash, este retorna um documento HTML.

Como é que o script 2 pode enviar um documento HTML inteiro, mas o script 1 não?

Roteiro 1

#!/bin/bash
cat <<'EOF'
Status: 200 OK
Content-type: text/html

<p>Under construction.</p>
EOF

Roteiro 2

<?php
print <<<EOF  
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    ...etc
  </head>

  <body>
  ...etc
  </body>
</html>
EOF;
?>

EDITAR

phpvem em 2 sabores: as versões CLI e CGI. Se você acabou de executar o Script 2 a partir da linha de comando, php test2.phpa única saída produzida por phpé exatamente o que você vê: o documento HTML. php-cgié a versão CGI (instalar no Ubuntu/Deb como apt install php-cgi). O Apache (efetivamente) executa a versão CGI (na vida real, ele faz isso de maneira ligeiramente diferente, mas com os mesmos resultados):

 $ php-cgi test2.php
Content-type: text/html; charset=UTF-8

<!DOCTYPE html>
...rest of doc

Os scripts CGI devem retornar pelo menos Content-typepara o Apache (mas podem retornar mais cabeçalhos, incluindo Status). Portanto, a resposta é que ambos os scripts funcionam porque o Script 1 retorna explicitamente Content-type, enquanto a versão CGI oculta phpfaz o mesmo.

O script bash pode retornar todo o documento HTML, desde que também retorne o arquivo Content-type.

apache-2.2
  • 3 3 respostas
  • 40 Views

3 respostas

  • Voted
  1. vidarlo
    2022-12-07T12:05:35+08:002022-12-07T12:05:35+08:00

    PHP e CGI são duas coisas diferentes neste contexto.

    CGI é uma interface entre um programa - neste caso, um script bash - e o servidor web. Esta interface especifica a comunicação entre o servidor web e o programa.

    Este padrão requer que o programa retorne todos os cabeçalhos, incluindo cabeçalhos de status, antes do conteúdo real. Em HTTP, os cabeçalhos e o corpo são separados por uma única linha - portanto, o formato em que você

    Header
    Header
    
    Content
    

    Após os cabeçalhos, você pode incluir um documento HTML completo - ou qualquer outro tipo de dados que corresponda aos cabeçalhos enviados.

    O PHP faz algumas suposições para você e, a menos que você as substitua, ele define o tipo de conteúdo, o código de status e assim por diante automaticamente.

    • 0
  2. Best Answer
    yagmoth555
    2022-12-07T12:06:02+08:002022-12-07T12:06:02+08:00

    No CGI você precisa enviar o Content-Type. O PHP o gera para você. (verifique a saída por meio de um navegador, você a verá mesmo que não a veja em seu código.

    Eu tenho um CGI que fiz em C, e você realmente precisa do tipo de conteúdo;

    No meu caso por exemplo;

    printf("Tipo de conteúdo: text/html;charset=us-ascii\n\n");

    Se você precisar alterar o cabeçalho no php, deverá chamar o cabeçalho no início do seu script.

    ou seja;

    header('Tipo de conteúdo: aplicativo/json');

    • 0
  3. Elstone IT Services Limited
    2022-12-07T12:20:48+08:002022-12-07T12:20:48+08:00

    Você precisa incluir uma resposta de cabeçalho CGI válida, não uma resposta HTTP, se chamar um script via CGI por meio do Apache. Acho que, em essência (detalhe abaixo), você precisa remover "Status: 200 OK" do seu arquivo e pode funcionar.

    Existe um bom artigo do próprio Apache ( https://httpd.apache.org/docs/2.2/howto/cgi.html ) que mostra o mínimo para obter uma resposta válida.

    Um exemplo de cabeçalho recebido pelo cliente pode ser o seguinte:

    HTTP/1.x 200 OK
    Transfer-Encoding: chunked
    Date: Tue, 06 Dec 2021 19:58:00 GMT
    Server: My_Bash_Script
    Connection: close
    X-Powered-By: My_Bash_Script
    Pragma: public
    Expires: Tue, 06 Dec 2021 20:58:00 GMT
    Cache-Control: max-age=3600, public
    Last-Modified: Tue, 06 Dec 2021 20:58:00 GMT
    Content-Encoding: gzip
    Vary: Accept-Encoding, Cookie, User-Agent
    Content-Type: text/html; charset=UTF-8
     
    <!DOCTYPE html>
    <head><title>Under construction</title>
    <body><p>Under construction.</p></body>
    </html>
    

    Mas seu CGI só precisa enviar de "Content-Type: text/html; charset=UTF-8" para baixo.

    Um artigo bastante bom pode ser encontrado aqui explicando os cabeçalhos: https://code.tutsplus.com/tutorials/http-headers-for-dummies--net-8039

    Com relação a um arquivo PHP servido via Apache, existem várias camadas de comunicação:

    • Uma solicitação é feita ao Apache em uma porta TCP. Isso inclui um cabeçalho de solicitação se for via HTTP.
    • O Apache executa todas as regras (por exemplo, mod_rewrite) e lida com todas as conexões SSL/apertos de mão necessários.
    • O Apache então detecta a extensão do arquivo como PHP e chama o script PHP por meio do interpretador PHP.
    • O código PHP é interpretado e transformado em uma string estática (espero :-) que é retornada ao Apache e contém o código HTML.
    • O Apache adiciona as informações do cabeçalho à página HTML, juntamente com qualquer outro processamento de saída.
    • Isso é serializado e canalizado de volta pela conexão TCP para o cliente.

    Outra boa maneira de explorar os cabeçalhos é usar o Firefox / Chrome Developer Tools (pressionar F12 no Firefox os abre). Vá para a guia Rede assim que as Ferramentas do desenvolvedor estiverem abertas e recarregue a página (Ctrl + R no Windows/Linux). Existe uma opção "Raw" onde você pode ver os dados exatos que foram enviados e recebidos.

    Finalmente, se você encontrar um site, ou mesmo que seu CGI esteja sendo servido por http em vez de https, você pode instalar o Wireshark ( https://www.wireshark.org ) e monitorar facilmente as conversas de tráfego para aprender o diferencial entre o que você estão enviando que está sendo mal interpretado e como é uma conversação de página html estática normal servida pelo Apache.

    PS (em 2022,) Se você realmente estiver executando o Apache 2.2:

    • Talvez você esteja perdendo outros recursos do Apache 2.4 que podem ajudá-lo a chegar onde deseja um pouco mais rápido: https://httpd.apache.org/docs/2.4/new_features_2_4.html
    • E observe que o Apache 2.2 é EOL (desde 2017) e contém várias vulnerabilidades: https://httpd.apache.org/security/vulnerabilities_22.html
    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve