Quando devo usar o método GET ou POST? Qual a diferença entre eles?

249

Qual é a diferença ao usar GETou POSTmétodo? Qual é o mais seguro? Quais são (des) vantagens de cada um deles?

( pergunta semelhante )

Adriana
fonte
2
Get não possui um corpo, portanto, na prática, você está limitado aos pares nome -> valor como estrutura de dados devido à falta de qualquer formato de codificação de string de consulta para estruturas mais complexas. Se você precisar lidar com estruturas de dados mais complexas em suas solicitações (ou seja, uma matriz, objeto etc.), precisará usar o POST e talvez formatos mais avançados (json / xml). Em poucas palavras: não use GET, a menos que você precise (ou seja, o URL / recurso deve ser detectável).
themihai
1
Possível duplicata de Quando você usa o POST e quando você usa o GET?
Imran Ali Khan

Respostas:

263

Não é uma questão de segurança. O protocolo HTTP define solicitações do tipo GET como idempotentes , enquanto os POSTs podem ter efeitos colaterais. Em inglês simples, isso significa que o GET é usado para visualizar algo, sem alterá-lo, enquanto o POST é usado para alterar algo. Por exemplo, uma página de pesquisa deve usar GET, enquanto um formulário que altera sua senha deve usar POST.

Além disso, observe que o PHP confunde um pouco os conceitos. Uma solicitação POST obtém entrada da cadeia de consulta e através do corpo da solicitação. Uma solicitação GET apenas obtém entrada da string de consulta. Portanto, uma solicitação POST é um superconjunto de uma solicitação GET; você pode usar $_GETem uma solicitação POST e pode até fazer sentido ter parâmetros com o mesmo nome $_POSTe $_GETisso significa coisas diferentes.

Por exemplo, digamos que você tenha um formulário para editar um artigo. O ID do artigo pode estar na string de consulta (e, portanto, disponível até $_GET['id']), mas digamos que você queira alterar o ID do artigo. O novo ID pode estar presente no corpo da solicitação ( $_POST['id']). OK, talvez esse não seja o melhor exemplo, mas espero que ilustre a diferença entre os dois.

Troelskn
fonte
13
Definitivamente, há um aspecto de segurança na diferença entre GET e POSTs. Um site malicioso pode colar uma solicitação GET arbitrária em uma tag de imagem, por exemplo, fazendo com que os usuários façam uma GET em outro servidor. Se esse GET for como outro servidor / deletemyaccount , coisas ruins acontecem.
24340 Frank Schwieterman
2
O que eu quis dizer foi que o conteúdo do $ _POST não está magicamente oculto para usuários mal-intencionados. Obviamente, existem aspectos de segurança em toda a programação.
troelskn
1
Este post não responde completamente à pergunta porque ele não menciona as implicações de segurança. A parte superior é válida desde que o erro ortográfico "inglês doloroso" seja alterado para "inglês simples". A parte inferior é muito difícil de seguir. No geral, muito melhor do que o meu post tho. :-)
Akrikos 03/02/09
1
"Uma solicitação POST obtém entrada da string de consulta e através do corpo da solicitação." IMHO isso está incorreto. Para usar qualquer entrada, você precisa usar $ _REQUEST. $ _POST não recebe as entradas de URL.
Gunnar Bernstein
1
@Frank Schwieterman Eu sei que este post é antigo, mas excluir minha conta não é idempotente e não deve estar usando get.
Frostymarvelous 31/08/14
77

Quando o usuário digita as informações em um formulário e clica em Enviar, há duas maneiras pelas quais as informações podem ser enviadas do navegador para o servidor: na URL ou no corpo da solicitação HTTP.

O método GET, que foi usado no exemplo anterior, anexa pares de nome / valor ao URL. Infelizmente, o tamanho de uma URL é limitado, portanto esse método funciona apenas se houver apenas alguns parâmetros. O URL pode ser truncado se o formulário usar um grande número de parâmetros ou se os parâmetros contiverem grandes quantidades de dados. Além disso, os parâmetros transmitidos na URL são visíveis no campo de endereço do navegador, não sendo o melhor local para a exibição de uma senha.

A alternativa ao método GET é o método POST. Esse método empacota os pares nome / valor dentro do corpo da solicitação HTTP, o que cria uma URL mais limpa e não impõe limitações de tamanho na saída dos formulários. Também é mais seguro.

IAdapter
fonte
1
Como é mais "seguro"?
Julian Reschke
4
porque é mais difícil de mudar? você pode alterar GET na barra de endereço, mas não é tão fácil com o POST.
IAdapter 02/02/09
8
O servidor não pode confiar no cliente. Projetar seu aplicativo com base em suposições falsas está longe de ser seguro.
troelskn
O openid também não é salvo, porque pode ser quebrado?
IAdapter 03/02/09
1
Acredito que esta seja a explicação mais clara - diferença sobre a localização dos dados enviados. Obrigado.
greenoldman
37

A melhor resposta foi a primeira.

Você está usando:

  • GET quando você deseja recuperar dados (GET DATA).
  • POST quando você deseja enviar dados (POST DATA).
alex
fonte
2
Qual é o padrão de serviço de solicitação / resposta usado e você deseja fazer as duas coisas? ;) Prefiro usar o POST na maioria dos casos em que preciso receber uma resposta.
Dmitry Pavlov
8
Geralmente isso é verdade. GETtambém é perfeitamente capaz de 'enviar' dados, portanto, não é uma resposta muito precisa.
Patrick Hofman
23

Existem duas implicações comuns de "segurança" no uso GET. Como os dados aparecem na string da URL, é possível que alguém que esteja olhando por cima do seu ombro na barra de endereços / URL possa visualizar algo que não deve ter acesso, como um cookie de sessão que poderia ser usado para seqüestrar sua sessão. Lembre-se de que todos têm telefones com câmera.

A outra implicação de segurança GETtem a ver com as GETvariáveis ​​registradas na maioria dos servidores da Web, como parte da URL solicitante. Dependendo da situação, do clima regulatório e da sensibilidade geral dos dados, isso pode gerar preocupações.

Alguns clientes / firewalls / sistemas IDS podem desaprovar GETsolicitações que contêm uma quantidade excessiva de dados e, portanto, fornecer resultados não confiáveis.

POST suporta funcionalidade avançada, como suporte para entrada binária de várias partes usada para upload de arquivos para servidores da Web.

POSTrequer um cabeçalho de tamanho de conteúdo que possa aumentar a complexidade de uma implementação de cliente específica do aplicativo, pois o tamanho dos dados enviados deve ser conhecido antecipadamente, impedindo que uma solicitação do cliente seja formada em um modo incremental de passagem única. Talvez seja um problema menor para quem optar por abusar HTTPusando-o como um transporte RPC (Remote Procedure Call).

Outros já fizeram um bom trabalho ao cobrir as diferenças semânticas e a parte "quando" desta questão.

Einstein
fonte
17

Uso GET quando estou recuperando informações de um URL e POST quando estou enviando informações para um URL.

Mark Biek
fonte
1
mas você também pode usar GET para enviar. A diferença é o formato (no URL (GET) ou na solicitação (POST)).
eric
Se o terminal aceitar um arquivo e retornar uma linha do arquivo (nenhuma criação ou alteração de dados ou banco de dados está envolvida), o terminal deve ser GET ou POST?
variável
17

Você deve usar o POST se houver muitos dados ou informações confidenciais (coisas realmente sensíveis também precisam de uma conexão segura).

Use GET se quiser que as pessoas possam marcar sua página como favorita, porque todos os dados estão incluídos no favorito.

Apenas tome cuidado com as pessoas que pressionam REFRESH com o método GET, porque os dados serão enviados novamente todas as vezes sem avisar o usuário (o POST às vezes avisa o usuário sobre o reenvio de dados).

Conceder
fonte
Se o terminal aceitar um arquivo e retornar uma linha do arquivo (nenhuma criação ou alteração de dados ou banco de dados está envolvida), o terminal deve ser GET ou POST?
variável
@variable POST. Nesse caso, principalmente porque o POST foi criado para lidar com uploads de arquivos e o GET padrão não. Você precisaria enviar o arquivo toda vez que a página carregar, portanto, faz sentido usar apenas o POST padrão em vez do arquivo GET +, o que interromperia a expectativa do GET de que um URL sempre produza os mesmos resultados mais ou menos.
Grant
14

Este documento do W3C explica o uso de HTTP GET e POST.

Eu acho que é uma fonte autorizada.

O resumo é (seção 1.3 do documento):

  • Use GET se a interação for mais parecida com uma pergunta (ou seja, é uma operação segura, como consulta, operação de leitura ou pesquisa).
  • Use POST se:
    • A interação é mais como um pedido ou
    • A interação altera o estado do recurso de uma maneira que o usuário perceberia (por exemplo, uma assinatura de um serviço) ou
    • O usuário deve ser responsabilizado pelos resultados da interação.
chus
fonte
9
Eu acho que isso pode ser resumido ainda mais assim: GET quando o estado do servidor não é alterado, POST quando é.
Yamcha
10

Os métodos Get e Post não têm nada a ver com a tecnologia de servidor que você está usando, funciona da mesma maneira em php, asp.net ou ruby. GET e POST fazem parte do protocolo HTTP. Como assinalado, o POST é mais seguro. Os formulários POST também não são armazenados em cache pelo navegador. O POST também é usado para transferir grandes quantidades de dados.

sarsnake
fonte
8

O motivo do uso do POST ao fazer alterações nos dados:

  • Um acelerador da Web como o Google Web Accelerator clicará em todos os links (GET) em uma página e os armazenará em cache. Isso é muito ruim se os links fizerem alterações.
  • Um navegador armazena em cache as solicitações GET, mesmo que o usuário clique no link, talvez não envie uma solicitação ao servidor para executar a alteração.
  • Para proteger seu site / aplicativo contra o CSRF, você deve usar o POST. Para proteger completamente seu aplicativo, você também deve gerar um identificador exclusivo no servidor e enviá-lo na solicitação.

Além disso, não coloque informações confidenciais na string de consulta (única opção com GET), pois elas aparecem na barra de endereços, nos favoritos e nos logs do servidor.

Espero que isso explique por que as pessoas dizem que o POST é 'seguro'. Se você estiver transmitindo dados confidenciais, deverá usar o SSL.

Sarel Botha
fonte
8

GETe POSTsão métodos HTTP que podem atingir objetivos semelhantes

GETé basicamente apenas para obter (recuperar) dados, A GETnão deve ter um corpo; portanto, além dos cookies, o único lugar para passar informações é no URL e os URLs são limitados em comprimento, GETsão menos seguros em comparação com os POSTdados enviados, o URL

Nunca use GETao enviar senhas, cartão de crédito ou outras informações confidenciais !, Os dados são visíveis para todos na URL, podem ser dados em cache. GETé inofensivo quando recarregamos ou chamamos o botão de retorno, ele será marcado como livro, os parâmetros permanecem no histórico do navegador, somente caracteres ASCII são permitidos.

POSTpode envolver qualquer coisa, como armazenamento ou atualização de dados, pedido de um produto ou envio de e-mail. POSTO método tem um corpo.

POSTO método é protegido para passar informações confidenciais e confidenciais ao servidor, não ficará visível nos parâmetros de consulta no URL e os parâmetros não serão salvos no histórico do navegador. Não há restrições no comprimento dos dados. Quando estamos recarregando, o navegador deve alertar o usuário de que os dados estão prestes a ser reenviados. POSTO método não pode ser marcado como favorito

user3540599
fonte
3
  1. O método GET é usado para enviar os dados menos sensíveis, enquanto o método POST é usado para enviar os dados confidenciais.
  2. Usando o método POST, você pode enviar uma grande quantidade de dados em comparação com o método GET.
  3. Os dados enviados pelo método GET são visíveis na barra de cabeçalho do navegador, enquanto os dados enviados pelo método POST são invisíveis.
Mel
fonte
0

Use o método GET se desejar recuperar os recursos da URL. Você sempre pode ver a última página se pressionar o botão Voltar do seu navegador, e ele pode ser marcado como favorito, portanto, não é tão seguro quanto o método POST.

Use o método POST se desejar 'enviar' algo para o URL. Por exemplo, você deseja criar uma conta do Google e pode precisar preencher todas as informações detalhadas e clicar no botão 'enviar' (o método POST é chamado aqui), depois de enviar com êxito e tentar pressionar o botão Voltar do seu navegador , você receberá um erro ou um novo formulário em branco, em vez da última página com o formulário preenchido.

RobotCharlie
fonte
-10

O GETmétodo:

  • É usado apenas para enviar data de 256 caracteres

  • Ao usar esse método, as informações podem ser vistas no navegador

  • É o método padrão usado pelos formulários

  • Não é tão seguro.


O POSTmétodo:

  • É usado para enviar dados ilimitados.

  • Com esse método, as informações não podem ser vistas no navegador

  • Você pode mencionar explicitamente o POSTmétodo

  • É mais seguro que o GETmétodo

  • Fornece recursos mais avançados

Sidharam Anache
fonte
"É usado apenas para enviar data de 256 caracteres" - não é verdade. "Ao usar esse método, as informações podem ser vistas no navegador" - os dados da postagem também são visíveis nos navegadores, mas não são tão óbvios. "Ele fornece recursos mais avançados" - como?
Quentin
Esta não é uma resposta muito útil. Informações incorretas como 'não é tão seguro' e 'fornecem recursos mais avançados' e outras coisas mencionadas por Quentin.
Andrew Barber