Qual è la differenza quando si utilizza GET
o il POST
metodo? Quale è più sicuro? Quali sono i (dis) vantaggi di ciascuno di essi?
( domanda simile )
Qual è la differenza quando si utilizza GET
o il POST
metodo? Quale è più sicuro? Quali sono i (dis) vantaggi di ciascuno di essi?
( domanda simile )
Risposte:
Non è una questione di sicurezza. Il protocollo HTTP definisce le richieste di tipo GET come idempotenti , mentre i POST possono avere effetti collaterali. In parole povere, ciò significa che GET viene utilizzato per visualizzare qualcosa, senza modificarlo, mentre POST viene utilizzato per cambiare qualcosa. Ad esempio, una pagina di ricerca dovrebbe usare GET, mentre un modulo che modifica la password dovrebbe usare POST.
Inoltre, nota che PHP confonde un po 'i concetti. Una richiesta POST ottiene l'input dalla stringa di query e attraverso il corpo della richiesta. Una richiesta GET ottiene solo l'input dalla stringa di query. Quindi una richiesta POST è un superset di una richiesta GET; puoi usarlo $_GET
in una richiesta POST e potrebbe anche avere senso avere parametri con lo stesso nome $_POST
e $_GET
che significano cose diverse.
Ad esempio, supponiamo che tu abbia un modulo per la modifica di un articolo. L'ID articolo potrebbe trovarsi nella stringa della query (e, quindi, disponibile tramite $_GET['id']
), ma supponiamo che tu voglia cambiare l'id articolo. Il nuovo ID potrebbe quindi essere presente nel corpo della richiesta ( $_POST['id']
). OK, forse non è il miglior esempio, ma spero che illustri la differenza tra i due.
Quando l'utente immette le informazioni in un modulo e fa clic su Invia, ci sono due modi in cui le informazioni possono essere inviate dal browser al server: nell'URL o all'interno del corpo della richiesta HTTP.
Il metodo GET, utilizzato nell'esempio precedente, aggiunge coppie URL nome / valore all'URL. Sfortunatamente, la lunghezza di un URL è limitata, quindi questo metodo funziona solo se ci sono solo alcuni parametri. L'URL potrebbe essere troncato se il modulo utilizza un numero elevato di parametri o se i parametri contengono grandi quantità di dati. Inoltre, i parametri passati all'URL sono visibili nel campo dell'indirizzo del browser, non il posto migliore per visualizzare una password.
L'alternativa al metodo GET è il metodo POST. Questo metodo racchiude le coppie nome / valore all'interno del corpo della richiesta HTTP, il che crea un URL più pulito e non impone limiti di dimensione all'output dei moduli. È anche più sicuro.
La migliore risposta è stata la prima.
Tu stai usando:
GET
è anche perfettamente in grado di "inviare" dati, quindi non è una risposta molto accurata.
Ci sono due implicazioni comuni sulla "sicurezza" nell'uso GET
. Poiché i dati vengono visualizzati nella stringa URL, è possibile che qualcuno che ti guardi alle spalle nella barra degli indirizzi / URL possa essere in grado di visualizzare qualcosa a cui non dovrebbero essere a conoscenza, come un cookie di sessione che potrebbe essere potenzialmente utilizzato per dirottare la sessione. Tieni presente che tutti hanno telefoni con fotocamera.
L'altra implicazione sulla sicurezza GET
ha a che fare con la GET
registrazione delle variabili nella maggior parte dei server Web che accedono al registro come parte dell'URL richiedente. A seconda della situazione, del clima regolamentare e della sensibilità generale dei dati ciò può potenzialmente sollevare preoccupazioni.
Alcuni client / firewall / sistemi IDS potrebbero disapprovare le GET
richieste che contengono una quantità eccessiva di dati e pertanto potrebbero fornire risultati inaffidabili.
POST
supporta funzionalità avanzate come il supporto per l'input binario multiparte utilizzato per il caricamento di file su server Web.
POST
richiede un'intestazione di lunghezza del contenuto che può aumentare la complessità di un'implementazione client specifica dell'applicazione poiché la dimensione dei dati inviati deve essere nota in anticipo impedendo che una richiesta client venga formata in una modalità incrementale a passaggio singolo. Forse un problema minore per coloro che scelgono di abusare HTTP
utilizzandolo come trasporto RPC (Remote Procedure Call).
Altri hanno già fatto un buon lavoro nel coprire le differenze semantiche e la parte "quando" di questa domanda.
Uso GET quando recupero informazioni da un URL e POST quando invio informazioni a un URL.
Dovresti usare POST se ci sono molti dati o una sorta di informazione sensibile (anche le cose veramente sensibili hanno bisogno di una connessione sicura).
Usa OTTIENI se vuoi che le persone possano aggiungere la tua pagina ai segnalibri, perché tutti i dati sono inclusi nel segnalibro.
Fai attenzione alle persone che colpiscono REFRESH con il metodo GET, perché i dati verranno inviati di nuovo ogni volta senza avvisare l'utente (il POST a volte avvisa l'utente di inviare nuovamente i dati).
Questo documento del W3C spiega l'uso di HTTP GET e POST.
Penso che sia una fonte autorevole.
Il sommario è (sezione 1.3 del documento):
- Utilizzare OTTIENI se l'interazione è più simile a una domanda (ovvero, è un'operazione sicura come una query, un'operazione di lettura o una ricerca).
- Usa POST se:
- L'interazione è più simile a un ordine, oppure
- L'interazione modifica lo stato della risorsa in modo che l'utente possa percepire (ad esempio un abbonamento a un servizio), oppure
- L'utente è ritenuto responsabile per i risultati dell'interazione.
I metodi Get and Post non hanno nulla a che fare con la tecnologia server che stai utilizzando, funziona allo stesso modo in php, asp.net o ruby. GET e POST fanno parte del protocollo HTTP. Come notato da Mark, il POST è più sicuro. I moduli POST non vengono inoltre memorizzati nella cache dal browser. Il POST viene anche utilizzato per trasferire grandi quantità di dati.
Il motivo per utilizzare POST quando si apportano modifiche ai dati:
Inoltre, non inserire informazioni riservate nella stringa di query (solo opzione con GET) perché vengono visualizzate nella barra degli indirizzi, nei segnalibri e nei registri del server.
Speriamo che questo spieghi perché la gente dice che il POST è "sicuro". Se si stanno trasmettendo dati sensibili, è necessario utilizzare SSL.
GET
e POST
sono metodi HTTP che possono raggiungere obiettivi simili
GET
è fondamentalmente solo per ottenere (recuperare) dati, A GET
non dovrebbe avere un corpo, quindi a parte i cookie, l'unico posto dove passare le informazioni è nell'URL e gli URL sono di lunghezza limitata, GET
è meno sicuro rispetto al POST
fatto che i dati inviati fanno parte di l'URL
Non utilizzare mai GET
quando si inviano password, carta di credito o altre informazioni sensibili! I dati sono visibili a tutti nell'URL, Possono essere memorizzati nella cache.
GET
è innocuo quando si ricarica o si richiama il pulsante, sarà contrassegnato dal libro, i parametri rimangono nella cronologia del browser, sono ammessi solo caratteri ASCII.
POST
può comportare qualsiasi cosa, come l'archiviazione o l'aggiornamento dei dati, l'ordinazione di un prodotto o l'invio di e-mail. POST
il metodo ha un corpo.
POST
il metodo è protetto per trasmettere informazioni sensibili e riservate al server e non sarà visibile nei parametri di query nell'URL e i parametri non verranno salvati nella cronologia del browser. Non ci sono restrizioni sulla lunghezza dei dati. Quando ricarichiamo, il browser dovrebbe avvisare l'utente che i dati stanno per essere reinviati. POST
il metodo non può essere aggiunto ai segnalibri
Utilizzare il metodo GET se si desidera recuperare le risorse dall'URL. Potresti sempre vedere l'ultima pagina se premi il pulsante Indietro del browser e potrebbe essere inserita nei segnalibri, quindi non è sicura come il metodo POST.
Utilizzare il metodo POST se si desidera "inviare" qualcosa all'URL. Ad esempio, vuoi creare un account Google e potrebbe essere necessario inserire tutte le informazioni dettagliate, quindi premi il pulsante "Invia" (il metodo POST viene chiamato qui), una volta inviato correttamente, e prova a premere nuovamente il pulsante del browser , visualizzerai un errore o un nuovo modulo vuoto, anziché l'ultima pagina con modulo compilato.
Il GET
metodo:
Viene utilizzato solo per l'invio di una data di 256 caratteri
Quando si utilizza questo metodo, le informazioni possono essere visualizzate sul browser
È il metodo predefinito utilizzato dai moduli
Non è così sicuro.
Il POST
metodo:
Viene utilizzato per l'invio di dati illimitati.
Con questo metodo, le informazioni non possono essere visualizzate sul browser
Puoi menzionare esplicitamente il POST
metodo
È più sicuro del GET
metodo
Fornisce funzionalità più avanzate