Em toda a internet, vejo os seguintes conselhos:
Um GET nunca deve alterar dados no servidor - use uma solicitação POST para esse
Qual é a base para essa ideia?
Se eu faço um serviço php que insere dados no banco de dados e transmito parâmetros na string de consulta GET, por que isso está errado? (Estou usando instruções preparadas, para cuidar da injeção de SQL). Uma solicitação POST é de alguma forma mais segura?
Ou há alguma razão histórica para isso? Em caso afirmativo, qual é a validade deste conselho hoje?
http
http-request
Devdatta Tengshe
fonte
fonte
Respostas:
Este não é um conselho.
A
GET
é definido dessa maneira no protocolo HTTP . É suposto ser idempotente e seguro .Quanto ao porquê - a
GET
pode ser armazenado em cache e em um navegador, atualizado. De novo e de novo e de novo.Isso significa que, se você fizer o mesmo
GET
novamente, será inserido novamente no seu banco de dados .Considere o que isso pode significar se ele se
GET
tornar um link e for rastreado por um mecanismo de pesquisa. Você terá seu banco de dados cheio de dados duplicados.Sugiro também a leitura de URIs, endereçamento e o uso de HTTP GET e POST .
Há também um problema com a ligação prefetching em alguns navegadores - eles vão fazer uma chamada de pré-busca links, mesmo se não for indicada por isso, o autor da página.
Se, digamos, seu logout estiver protegido por um "GET", vinculado a todas as páginas do site, as pessoas poderão se desconectar apenas devido a esse comportamento.
fonte
GET
nunca será uma ação destrutiva (com razão, uma vez que é especificada dessa maneira). Se você agora interromper seu aplicativo quebrando essa especificação, poderá manter as duas partes do aplicativo.GET
. Esse conselho está simplesmente errado. Seguro significa que o usuário não pode ser responsabilizado por efeitos colaterais, não que não possa haver efeitos colaterais. Caso contrário, você não poderia ter arquivos de log para o seu servidor, o que seria um absurdo! Isso é explicado claramente na seção 9.1.1 da RFC2616.GET
não deve alterar o recurso solicitado peloGET
, mas isso não significa que 'nada no servidor deve mudar'. É claro que coisas como logs, contadores e outro estado do servidor podem mudar durante qualquer solicitação.Cada verbo HTTP tem sua própria responsabilidade. Por exemplo
GET
, conforme definido pela RFCPOST
, por outro lado, significa inserir ou mais formalmenteRazões para mantê-lo desta maneira:
GET
atuar como meio de recuperação de informações e mineração de dadosGET
é efetivamente uma leitura , enquantoPOST
é efetivamente uma gravaçãoGET
o mesmo URL deve retornar os mesmos resultados para todos os usuários, caso contrário você não confiará mais no resultado retornadoPara garantir a integridade e apenas para impor o uso correto (origem) :
GET
os parâmetros são passados como parte da URL, que possui um tamanho pequeno e limitado de 256 caracteres por padrão, com alguns servidores suportando mais de 4000 caracteres. Se você deseja inserir um registro longo, não há maneira legítima de transmitir esses dados em̶G̶E̶T̶
̶ são transferidos Texto simples. O URL é realmente criptografado com TLS, portanto, o TLS está correto.GET
é impraticávelGET
é reexecutado se um usuário pressionar um botão Voltar em um navegador?
sinal dentrofonte
EDIT: Antes, eu disse que o POST ajuda a protegê-lo contra o CSRF, mas isso está errado. Eu não pensei nisso corretamente. Você deve exigir um token oculto exclusivo do escopo da sessão em todas as suas solicitações para alterar os dados para se proteger contra o CSRF.
Nos primeiros dias da internet, havia aceleradores de navegador. Esses programas começariam a clicar nos links de uma página para armazenar em cache o conteúdo. O Google Web Accelerator foi um desses programas. Isso pode causar estragos em um aplicativo que faz alterações quando um link é clicado. Eu assumiria que ainda existem pessoas usando software acelerador.
Servidores e navegadores proxy armazenam em cache as solicitações GET, portanto, quando o usuário acessa a página novamente, ele pode não enviar a solicitação ao seu aplicativo, para que o usuário pense que tomou uma ação, mas na verdade não o fez.
fonte
A resposta mais simples é "porque não é isso que
GET
significa".Usar
GET
para passar dados para uma atualização é como escrever uma carta de amor e enviá-la em um envelope marcado como "OFERTA ESPECIAL - Aja AGORA!" Nos dois casos, não se surpreenda que o destinatário e / ou os intermediários manuseiem incorretamente sua mensagem .fonte
Para suas operações CRUD em um aplicativo centralizado em banco de dados, use o seguinte esquema:
Usar HTTP GET para operações de leitura (SQL SELECT)
Use HTTP PUT para operações de atualização (SQL UPDATE)
Usar HTTP POST para criar operações (SQL INSERT)
Use HTTP DELETE para operações de exclusão (SQL DELETE)
fonte
Esse conselho, e todas as respostas aqui estão erradas. Obviamente, estou sendo excessivamente dramático, as outras respostas são excelentes, mas acredito que o conselho exato deve ser dado como:
Dizer "nunca" é muito extremo e, embora as outras respostas aqui expliquem com precisão por que você "raramente" deve fazê-lo, há alguns cenários em que é perfeitamente razoável alterar dados com um GET. Um exemplo é um link de verificação de e-mail de uso único. Normalmente, esses links contêm um GUID que, quando acessado, terá que alterar dados. Se implementadas corretamente, solicitações GET idênticas subsequentes serão ignoradas.
Obviamente, este é um caso extremo, mas certamente vale a pena notar.
fonte