La richiesta GET è leggermente meno sicura della richiesta POST. Nessuno dei due offre una vera "sicurezza" da solo; l'utilizzo di richieste POST non renderà magicamente sicuro il tuo sito Web da attacchi dannosi di un importo evidente. Tuttavia, l'utilizzo delle richieste GET può rendere insicura un'applicazione altrimenti sicura.
Il mantra che "non è necessario utilizzare le richieste GET per apportare modifiche" è ancora molto valido, ma ha poco a che fare con comportamenti dannosi . I moduli di accesso sono i più sensibili all'invio utilizzando il tipo di richiesta errato.
Cerca ragni e acceleratori web
Questa è la vera ragione per cui dovresti usare le richieste POST per cambiare i dati. I ragni di ricerca seguiranno tutti i collegamenti sul tuo sito Web, ma non invieranno moduli casuali che trovano.
Gli acceleratori Web sono peggiori degli spider di ricerca, poiché vengono eseguiti sul computer client e "fanno clic" su tutti i collegamenti nel contesto dell'utente connesso . Pertanto, un'applicazione che utilizza una richiesta GET per eliminare elementi, anche se richiede un amministratore, obbedirà felicemente agli ordini dell'acceleratore web (non dannoso!) Ed eliminerà tutto ciò che vede .
Vice attacco confuso
Un attacco delegato confuso (in cui il vice è il browser) è possibile indipendentemente dal fatto che si utilizzi una richiesta GET o POST .
Sui siti Web controllati dagli aggressori GET e POST sono ugualmente facili da inviare senza l'interazione dell'utente .
L'unico scenario in cui il POST è leggermente meno suscettibile è che molti siti Web che non sono sotto il controllo dell'aggressore (ad esempio un forum di terze parti) consentono l'incorporamento di immagini arbitrarie (consentendo all'aggressore di iniettare una richiesta GET arbitraria), ma impedisce a tutti modi per iniettare una richiesta POST arbitraria, sia automatica che manuale.
Si potrebbe obiettare che gli acceleratori web sono un esempio di attacco confuso ai vice, ma è solo una questione di definizione. Semmai, un malintenzionato malintenzionato non ha alcun controllo su questo, quindi non è certo un attacco , anche se il vice è confuso.
Registri proxy
È probabile che i server proxy registrino gli URL GET nella loro interezza, senza rimuovere la stringa di query. I parametri di richiesta POST non vengono normalmente registrati. È improbabile che i cookie vengano registrati in entrambi i casi. (esempio)
Questo è un argomento molto debole a favore del POST. In primo luogo, il traffico non crittografato può essere registrato nella sua interezza; un proxy dannoso ha già tutto ciò di cui ha bisogno. In secondo luogo, i parametri di richiesta hanno un uso limitato per un utente malintenzionato: ciò di cui hanno davvero bisogno sono i cookie, quindi se l'unica cosa che hanno sono i log proxy, è improbabile che siano in grado di attaccare un GET o un URL POST.
Esiste un'eccezione per le richieste di accesso: queste tendono a contenere la password dell'utente. Salvare questo nel registro proxy apre un vettore di attacco che è assente nel caso di POST. Tuttavia, l'accesso tramite HTTP semplice è intrinsecamente insicuro.
Cache proxy
I proxy di memorizzazione nella cache potrebbero conservare le risposte GET, ma non le risposte POST. Detto questo, le risposte GET possono essere rese non memorizzabili nella cache con meno sforzo rispetto alla conversione dell'URL in un gestore POST.
"Referer" HTTP
Se l'utente dovesse accedere a un sito Web di terze parti dalla pagina pubblicata in risposta a una richiesta GET, quel sito Web di terze parti vedrà tutti i parametri della richiesta GET.
Appartiene alla categoria di "rivela i parametri di richiesta a una terza parte", la cui gravità dipende da ciò che è presente in tali parametri. Le richieste POST sono naturalmente immuni a questo, tuttavia per sfruttare la richiesta GET un hacker dovrebbe inserire un link al proprio sito Web nella risposta del server.
Cronologia del browser
Questo è molto simile all'argomento "registri proxy": le richieste GET vengono archiviate nella cronologia del browser insieme ai loro parametri. L'attaccante può facilmente ottenerli se hanno accesso fisico alla macchina.
Azione di aggiornamento del browser
Il browser ritenterà una richiesta GET non appena l'utente preme "aggiorna". Potrebbe farlo quando si ripristinano le schede dopo l'arresto. Qualsiasi azione (diciamo, un pagamento) verrà quindi ripetuta senza preavviso.
Il browser non ritenterà una richiesta POST senza un avviso.
Questa è una buona ragione per usare solo le richieste POST per modificare i dati, ma non ha nulla a che fare con comportamenti dannosi e, quindi, sicurezza.
Quindi cosa dovrei fare?
- Utilizzare solo richieste POST per modificare i dati, principalmente per motivi non legati alla sicurezza.
- Utilizzare solo richieste POST per moduli di accesso; fare altrimenti introduce i vettori di attacco.
- Se il tuo sito esegue operazioni sensibili, hai davvero bisogno di qualcuno che sappia cosa stanno facendo, perché questo non può essere coperto in un'unica risposta. È necessario utilizzare HTTPS, HSTS, CSP, mitigare l'iniezione SQL, l'iniezione di script (XSS) , CSRF e una serie di altre cose che potrebbero essere specifiche della propria piattaforma (come la vulnerabilità dell'assegnazione di massa in vari framework: ASP.NET MVC , Ruby on Rails , ecc.). Non esiste una sola cosa che possa fare la differenza tra "sicuro" (non sfruttabile) e "non sicuro".
Su HTTPS, i dati POST sono codificati, ma gli URL possono essere sniffati da una terza parte?
No, non possono essere fiutati. Ma gli URL verranno archiviati nella cronologia del browser.
Sarebbe giusto dire che la migliore pratica è quella di evitare di inserire dati sensibili nel POST o GET del tutto e utilizzare invece il codice lato server per gestire le informazioni sensibili?
Dipende da quanto sia sensibile, o più specificamente, in che modo. Ovviamente il cliente lo vedrà. Chiunque abbia accesso fisico al computer del client lo vedrà. Il client può falsificarlo quando lo rispedisce. Se quelli contano allora sì, mantenere i dati sensibili sul server e non lasciarli andare.