Qual è la differenza tra HTTP-Get e HTTP-POST e perché HTTP-POST è più debole in termini di sicurezza

Qualcuno può spiegare la differenza tra un HTTP-GET e HTTP-POST? E perché la gente dice che un HTTP-POST è più debole in termini di sicurezza?

In una richiesta HTTP GET, le coppie chiave / valore sono specificate nell’URL:

http://server/something?value1=foo&value2=bar .

In una richiesta POST HTTP, le coppie chiave / valore vengono inviate come parte della richiesta HTTP dopo le intestazioni. Per esempio:

  POST / qualcosa HTTP / 1.1
  Host: server
  Lunghezza del contenuto: 21
  Content-Type: application / x-www-form-urlencoded

  valore1 = foo & valore2 = bar

È difficile descriverne uno in quanto più o meno sicuro dell’altro, ma i dati POST HTTP non sono visibili nell’URL e, quando si inviano dati a un sito Web, un POST HTTP può di solito essere eseguito solo a seguito dell’interazione dell’utente ( per esempio cliccando su un pulsante “Invia”).

Ciò significa che un utente non può essere indotto a visitare un URL come http://server/update_profile?name=I_suck e i dati sensibili non sono esposti nell’URL.

Puoi anche usare i nonces e altri token anti-contraffazione con i moduli html (che usano il POST) per prevenire altre forms di falsificazione di richieste cross-site.

In generale, il POST deve essere utilizzato per le richieste che potenzialmente modificano lo stato sul server e GET deve essere utilizzato per le operazioni di sola lettura.

Le specifiche HTTP differenziano POST e GET in termini del loro intento:

GET è idempotente: serve per ottenere una risorsa, senza modificare nulla sul server. Di conseguenza, dovrebbe essere perfettamente sicuro reinviare una richiesta GET.

POST no: serve per aggiornare le informazioni sul server. Pertanto non si può presumere che sia sicuro inviare nuovamente la richiesta, motivo per cui la maggior parte dei browser richiede conferma quando si effettua il refresh su una richiesta POST.

In termini di sicurezza, nessuna differenza. POST è più oscuro, forse, ma è una cosa molto diversa. La sicurezza deve essere aggiunta a un altro livello, ad esempio SSL.

Alcune note sulle richieste GET:

  1. Le richieste GET possono essere memorizzate nella cache
  2. Le richieste GET rimangono nella cronologia del browser
  3. È ansible contrassegnare le richieste GET
  4. Le richieste GET non dovrebbero mai essere utilizzate quando si gestiscono dati sensibili
  5. Le richieste GET hanno restrizioni sulla lunghezza
  6. Le richieste GET devono essere utilizzate solo per recuperare i dati

Alcune note sulle richieste POST:

  1. Le richieste POST non vengono mai memorizzate nella cache
  2. Le richieste POST non rimangono nella cronologia del browser
  3. Le richieste POST non possono essere inserite nei segnalibri
  4. Le richieste POST non hanno restrizioni sulla lunghezza dei dati

(Fonte: W3 Schools)

Non chiamerei POST più o meno sicuro di GET. Certo, i parametri vengono visualizzati come parte dell’URL quando si utilizza GET, quindi tutti i dati sensibili saranno immediatamente visibili all’utente. Tuttavia, è banale visualizzare e persino modificare qualsiasi parte della richiesta HTTP, quindi solo perché il POST non passa i dati attraverso l’URL può essere facilmente letto. A meno che tu non stia utilizzando HTTPS, GET e POST trasferiranno i dati in una forma facilmente accessibile.

Il metodo GET è pensato solo per il recupero dei dati e non dovrebbe avere effetti collaterali . Ma il POST è pensato per quello scopo specifico: alterare i dati sul lato server.

Le richieste GET possono essere facilmente rinegoziate (vedere la falsificazione di richieste tra siti ) semplicemente posizionando un’immagine su una pagina mentre le richieste POST non sono facili (questo è anche un motivo per cui si dovrebbero consentire solo le richieste POST autorizzate).