A solicitação GET é marginalmente menos segura que a solicitação POST. Nenhum dos dois oferece "segurança" verdadeira por si só; o uso de solicitações POST não tornará magicamente seu site seguro contra ataques maliciosos em uma quantidade perceptível. No entanto, o uso de solicitações GET pode tornar um aplicativo seguro caso contrário.
O mantra que você "não deve usar solicitações GET para fazer alterações" ainda é muito válido, mas isso tem pouco a ver com códigos maliciosos comportamento . Os formulários de login são os mais sensíveis a serem enviados usando o tipo de solicitação errado.
Aranhas de pesquisa e aceleradores da Web
Essa é a verdadeira razão pela qual você deve usar solicitações POST para alterar dados. As aranhas de busca seguirão todos os links do seu site, mas não enviarão formulários aleatórios que encontrarem.
Os aceleradores da Web são piores que os spiders de pesquisa, porque são executados na máquina do cliente e "clicam" em todos os links no contexto do usuário conectado . Assim, um aplicativo que usa uma solicitação GET para excluir itens, mesmo que exija um administrador, obedecerá com satisfação às ordens do acelerador da web (não malicioso!) E excluirá tudo o que vê .
Vice-ataque confuso
Um ataque de deputado confuso (em que o deputado é o navegador) é possível, independentemente de você usar uma solicitação GET ou POST .
Em sites controlados por invasores, GET e POST são igualmente fáceis de enviar sem a interação do usuário .
O único cenário em que o POST é um pouco menos suscetível é que muitos sites que não estão sob o controle do invasor (por exemplo, um fórum de terceiros) permitem incorporar imagens arbitrárias (permitindo que o invasor injete uma solicitação GET arbitrária), mas evitam todas maneiras de injetar uma solicitação POST arbitrária, seja automática ou manual.
Pode-se argumentar que os aceleradores da Web são um exemplo de ataque confuso, mas isso é apenas uma questão de definição. De qualquer forma, um invasor mal-intencionado não tem controle sobre isso; portanto, dificilmente é um ataque , mesmo que o deputado seja confuso.
Logs de proxy
É provável que os servidores proxy registrem URLs GET na sua totalidade, sem retirar a string de consulta. Os parâmetros de solicitação POST normalmente não são registrados. É improvável que os cookies sejam registrados nos dois casos. (exemplo)
Este é um argumento muito fraco a favor do POST. Em primeiro lugar, o tráfego não criptografado pode ser totalmente registrado; um proxy malicioso já tem tudo o que precisa. Em segundo lugar, os parâmetros de solicitação são de uso limitado para um invasor: o que eles realmente precisam são os cookies; portanto, se a única coisa que eles têm são logs de proxy, é improvável que eles consigam atacar um URL GET ou POST.
Há uma exceção para solicitações de login: elas tendem a conter a senha do usuário. Salvar isso no log do proxy abre um vetor de ataque ausente no caso do POST. No entanto, o login através de HTTP simples é inerentemente inseguro de qualquer maneira.
Cache de proxy
Os proxies de armazenamento em cache podem reter respostas GET, mas não respostas POST. Dito isto, as respostas GET podem ser tornadas não armazenáveis em cache com menos esforço do que converter a URL em um manipulador POST.
"Referenciador" HTTP
Se o usuário navegar para um site de terceiros a partir da página veiculada em resposta a uma solicitação GET, esse site de terceiros verá todos os parâmetros da solicitação GET.
Pertence à categoria "revela parâmetros de solicitação a terceiros", cuja gravidade depende do que está presente nesses parâmetros. As solicitações POST são naturalmente imunes a isso, no entanto, para explorar a solicitação GET, um hacker precisaria inserir um link para seu próprio site na resposta do servidor.
Histórico do navegador
Isso é muito semelhante ao argumento "logs de proxy": as solicitações GET são armazenadas no histórico do navegador, juntamente com seus parâmetros. O invasor pode obtê-los facilmente se tiver acesso físico à máquina.
Ação de atualização do navegador
O navegador tentará novamente uma solicitação GET assim que o usuário clicar em "atualizar". Isso pode ser feito ao restaurar as guias após o desligamento. Qualquer ação (por exemplo, um pagamento) será repetida sem aviso prévio.
O navegador não tentará novamente uma solicitação POST sem um aviso.
Esse é um bom motivo para usar apenas solicitações POST para alterar dados, mas não tem nada a ver com comportamento malicioso e, portanto, com segurança.
Então, o que eu deveria fazer?
- Use apenas solicitações POST para alterar dados, principalmente por motivos não relacionados à segurança.
- Use apenas solicitações POST para formulários de login; fazer o contrário introduz vetores de ataque.
- Se o seu site realiza operações confidenciais, você realmente precisa de alguém que saiba o que está fazendo, porque isso não pode ser coberto em uma única resposta. Você precisa usar HTTPS, HSTS, CSP, mitigar injeção SQL, injeção de script (XSS) , CSRF e um bilhão de outras coisas que podem ser específicas para sua plataforma (como a vulnerabilidade de atribuição em massa em várias estruturas: ASP.NET MVC , Ruby on Rails , etc.). Não existe nada que faça a diferença entre "seguro" (não explorável) e "não seguro".
No HTTPS, os dados do POST são codificados, mas os URLs podem ser detectados por terceiros?
Não, eles não podem ser cheirados. Mas os URLs serão armazenados no histórico do navegador.
Seria justo dizer que a melhor prática é evitar a possível colocação de dados confidenciais no POST ou GET e usar o código do servidor para manipular informações confidenciais?
Depende de quão sensível é, ou mais especificamente, de que maneira. Obviamente, o cliente verá. Qualquer pessoa com acesso físico ao computador do cliente o verá. O cliente pode falsificá-lo ao enviá-lo de volta para você. Se isso for importante, mantenha os dados confidenciais no servidor e não deixe que eles saiam.