GET vs. POST

HTTP POSTAR solicitações fornecem dados adicionais do cliente (navegador) para o servidor no corpo da mensagem. Em contraste, OBTER solicitações incluem todos os dados necessários no URL. Os formulários em HTML podem usar qualquer um dos métodos, especificando método = "POST" ou method = "GET" (padrão) no elemento. O método especificado determina como os dados do formulário são enviados ao servidor. Quando o método é GET, todos os dados do formulário são codificados na URL, anexados ao açao URL como parâmetros de sequência de caracteres de consulta. Com o POST, os dados do formulário são exibidos no corpo da mensagem da solicitação HTTP.

Gráfico de comparação

Gráfico de comparação GET versus POST
OBTERPOSTAR
História Os parâmetros permanecem no histórico do navegador porque fazem parte do URL Os parâmetros não são salvos no histórico do navegador.
Marcado como favorito Pode ser marcado como favorito. Não pode ser marcado como favorito.
Comportamento do botão VOLTAR / reenviar Solicitações GET são reexecutadas, mas não podem ser reenviadas ao servidor se o HTML estiver armazenado no cache do navegador. O navegador geralmente alerta o usuário que os dados precisarão ser reenviados.
Tipo de codificação (atributo enctype) application / x-www-form-urlencoded multipart / form-data or application / x-www-form-urlencoded Use codificação multipart para dados binários.
Parâmetros pode enviar, mas os dados do parâmetro são limitados ao que podemos inserir na linha de solicitação (URL). Mais seguro para usar menos de 2K de parâmetros, alguns servidores lidam com até 64K Pode enviar parâmetros, incluindo upload de arquivos, para o servidor.
Hackeado Mais fácil de hackear para crianças de script Mais difícil de invadir
Restrições no tipo de dados do formulário Sim, apenas caracteres ASCII permitidos. Sem restrições. Dados binários também são permitidos.
Segurança GET é menos seguro comparado ao POST, porque os dados enviados fazem parte da URL. Por isso, é salvo no histórico do navegador e nos logs do servidor em texto sem formatação. POST é um pouco mais seguro que GET porque os parâmetros não são armazenados no histórico do navegador ou nos logs do servidor da web.
Restrições no comprimento dos dados do formulário Sim, como os dados do formulário estão no URL e o comprimento do URL é restrito. Um limite de tamanho de URL seguro geralmente possui 2048 caracteres, mas varia de acordo com o navegador e o servidor da web. Sem restrições
Usabilidade O método GET não deve ser usado ao enviar senhas ou outras informações confidenciais. Método POST usado ao enviar senhas ou outras informações confidenciais.
Visibilidade O método GET é visível para todos (será exibido na barra de endereços do navegador) e tem limites na quantidade de informações a serem enviadas. Variáveis ​​do método POST não são exibidas na URL.
Em cache Pode ser armazenado em cache Não armazenado em cache

Conteúdo: GET vs POST

  • 1 Diferenças na submissão de formulários
    • 1.1 Prós e contras
  • 2 diferenças no processamento no servidor
  • 3 Uso recomendado
  • 4 E o HTTPS?
  • 5 Referências

Diferenças na submissão de formulários

A diferença fundamental entre MÉTODO = "GET" e MÉTODO = "POST" é que eles correspondem a pedidos HTTP diferentes, conforme definido nas especificações HTTP. O processo de envio para os dois métodos começa da mesma maneira - um conjunto de dados de formulário é construído pelo navegador e depois codificado da maneira especificada pelo enctype atributo. Para MÉTODO = "POST a enctype atributo pode ser multipart / form-data ou application / x-www-form-urlencoded, considerando que para MÉTODO = "GET", só application / x-www-form-urlencoded é permitido. Esse conjunto de dados do formulário é transmitido ao servidor.

Para envio de formulários com METHOD = "GET", o navegador constrói um URL usando o valor do açao atributo, anexando um ? anexando o conjunto de dados do formulário (codificado usando o tipo de conteúdo application / x-www-form-urlencoded). O navegador processa esse URL como se seguisse um link (ou como se o usuário tivesse digitado o URL diretamente). O navegador divide o URL em partes e reconhece um host e envia a esse host uma solicitação GET com o restante do URL como argumento. O servidor leva a partir daí. Observe que esse processo significa que os dados do formulário estão restritos aos códigos ASCII. Cuidado especial deve ser tomado para codificar e decodificar outros tipos de caracteres ao transmiti-los pela URL no formato ASCII.

O envio de um formulário com METHOD = "POST" faz com que uma solicitação POST seja enviada, usando o valor do açao atributo e uma mensagem criada de acordo com o tipo de conteúdo especificado pelo enctype atributo.

Prós e contras

Como os dados do formulário são enviados como parte da URL quando OBTER é usado --

  • Os dados do formulário são restritos aos códigos ASCII. Cuidado especial deve ser tomado para codificar e decodificar outros tipos de caracteres ao transmiti-los pela URL no formato ASCII. Por outro lado, dados binários, imagens e outros arquivos podem ser enviados por meio de MÉTODO = "POST"
  • Todos os dados do formulário preenchidos são visíveis no URL. Além disso, ele também é armazenado no histórico / registros de navegação na web do usuário. Essas questões tornam OBTER menos seguro.
  • No entanto, uma vantagem dos dados do formulário sendo enviados como parte da URL é que você pode marcar as URLs e usá-las diretamente e ignorar completamente o processo de preenchimento de formulários..
  • Há uma limitação na quantidade de dados do formulário que pode ser enviada porque os comprimentos de URL são limitados.
  • As crianças de script podem expor mais facilmente as vulnerabilidades no sistema para invadi-lo. Por exemplo, o Citibank foi invadido alterando os números de conta na string de URL.[1] Obviamente, hackers experientes ou desenvolvedores da Web podem expor essas vulnerabilidades, mesmo que o POST seja usado; é só um pouco mais difícil. Em geral, o servidor deve suspeitar de quaisquer dados enviados pelo cliente e se proteger contra referências diretas a objetos inseguras.

Diferenças no processamento no servidor

Em princípio, o processamento de dados de um formulário enviado depende se ele é enviado com MÉTODO = "GET" ou MÉTODO = "POST". Como os dados são codificados de maneiras diferentes, diferentes mecanismos de decodificação são necessários. Assim, de um modo geral, alterar o MÉTODO pode exigir uma alteração no script que processa a submissão. Por exemplo, ao usar a interface CGI, o script recebe os dados em uma variável de ambiente (QUERYSTRING) quando OBTER é usado. Mas quando POSTAR é usado, os dados do formulário são transmitidos no fluxo de entrada padrão (stdin) e o número de bytes a serem lidos é fornecido pelo cabeçalho Content-length.

Uso recomendado

Recomenda-se o GET ao enviar formulários "idempotentes" - aqueles que 'não alteram significativamente o estado do mundo'. Em outras palavras, formulários que envolvem apenas consultas ao banco de dados. Outra perspectiva é que várias consultas idempotentes terão o mesmo efeito que uma única consulta. Se houver atualizações de banco de dados ou outras ações, como acionar emails, recomenda-se o uso do POST.

No blog do desenvolvedor do Dropbox:

um navegador não sabe exatamente o que um formulário HTML específico faz, mas se o formulário for enviado via HTTP GET, o navegador saberá que é seguro tentar o envio automaticamente novamente se houver um erro de rede. Para formulários que usam HTTP POST, pode não ser seguro tentar novamente, portanto o navegador solicita a confirmação do usuário primeiro.

Uma solicitação "GET" geralmente é armazenável em cache, enquanto uma solicitação "POST" dificilmente pode ser. Para sistemas de consulta, isso pode ter um impacto considerável na eficiência, especialmente se as cadeias de consulta forem simples, pois os caches podem servir as consultas mais frequentes.

Em certos casos, usar POSTAR é recomendado mesmo para consultas idempotentes:

  • Se os dados do formulário contiverem caracteres não ASCII (como caracteres acentuados) e, em seguida, MÉTODO = "GET" é inaplicável em princípio, embora possa funcionar na prática (principalmente para caracteres ISO Latin 1).
  • Se o conjunto de dados do formulário for grande - digamos, centenas de caracteres - então MÉTODO = "GET" pode causar problemas práticos com implementações que não conseguem lidar com URLs longos.
  • Você pode querer evitar MÉTODO = "GET" para tornar menos visível aos usuários como o formulário funciona, principalmente para tornar os campos "ocultos" (INPUT TYPE = "HIDDEN") mais ocultos por não aparecerem no URL. Mas mesmo se você usar campos ocultos com MÉTODO = "POST", eles ainda aparecerão no código fonte HTML.

E o HTTPS?

Atualizado em 15 de maio de 2015: Especificamente ao usar HTTPS (HTTP sobre TLS / SSL), o POST oferece mais segurança que GET?

Esta é uma pergunta interessante. Digamos que você faça uma solicitação GET para uma página da web:

 GET https://www.example.com/login.php?user=mickey&passwd=mini 

Supondo que sua conexão com a Internet esteja sendo monitorada, quais informações sobre essa solicitação estarão disponíveis para o bisbilhoteiro? Se o POST for usado, e os dados do usuário e da senha forem incluídos nas variáveis ​​do POST, será mais seguro no caso de conexões HTTPS?

A resposta é não. Se você fizer uma solicitação GET, apenas as seguintes informações serão conhecidas pelo invasor que monitora seu tráfego na Web:

  1. O fato de você ter feito uma conexão HTTPS
  2. O nome do host - www.example.com
  3. O comprimento total da solicitação
  4. O comprimento da resposta

A parte do caminho da URL - ou seja, a página real solicitada, bem como os parâmetros da string de consulta - são protegidos (criptografados) enquanto estão "sem fio", ou seja, em trânsito a caminho do servidor de destino. A situação é exatamente a mesma para solicitações POST.

Obviamente, os servidores da Web tendem a registrar a URL inteira em texto sem formatação nos registros de acesso; portanto, enviar informações confidenciais pelo GET não é uma boa ideia. Isso se aplica independentemente de HTTP ou HTTPS ser usado.

Referências

  • wikipedia: POST (HTTP)
  • Métodos de solicitação HTTP
  • Postagem HTTP - W3.org
  • HTTP Get - W3.org
  • O HTTPS oculta os URLs que estão sendo acessados? - Troca de pilha