Quando dovrei usare il metodo GET o POST? Qual è la differenza tra loro?


249

Qual è la differenza quando si utilizza GETo il POSTmetodo? Quale è più sicuro? Quali sono i (dis) vantaggi di ciascuno di essi?

( domanda simile )


2
Get non ha un corpo, quindi in pratica significa che sei limitato a nome -> coppie di valori come struttura di dati a causa della mancanza di qualsiasi formato di codifica della stringa di query per una struttura più complessa. Se hai bisogno di gestire strutture di dati più complesse nelle tue richieste (es. Un array, un oggetto ecc.) Devi usare POST e forse formati più avanzati (json / xml). Detto in breve: non utilizzare GET a meno che non sia necessario (ovvero l'URL / la risorsa deve essere rilevabile).
themihai,

Risposte:


263

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 $_GETin una richiesta POST e potrebbe anche avere senso avere parametri con lo stesso nome $_POSTe $_GETche 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.


13
C'è sicuramente un aspetto di sicurezza nella differenza tra GET e POST. Un sito dannoso può inserire una richiesta GET arbitraria in un tag immagine, ad esempio, facendo sì che gli utenti facciano un GET contro un altro server. Se questo GET è come gli altri server / account deletemy allora accadono cose brutte.
Frank Schwieterman,

2
Quello che intendevo dire era che i contenuti di $ _POST non sono magicamente nascosti da utenti malintenzionati. Ci sono ovviamente aspetti di sicurezza nella programmazione di tutte le cose.
troelskn,

1
Questo post non risponde completamente alla domanda perché non menziona le implicazioni sulla sicurezza. La parte superiore è valida fintanto che l'errore di ortografia "inglese per il dolore" è cambiato in "inglese semplice". La parte inferiore è troppo difficile da seguire. Nel complesso, molto meglio del mio post tho. :-)
Akrikos,

1
"Una richiesta POST ottiene l'input dalla stringa di query e attraverso il corpo della richiesta." IMHO questo non è corretto. Per utilizzare entrambi gli input è necessario utilizzare $ _REQUEST. $ _POST non ottiene le voci dell'URL.
Gunnar Bernstein,

1
@Frank Schwieterman So che questo post è vecchio, ma elimina il mio account non è idempotente e non dovrebbe usare get.
frostymarvelous

77

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.


1
In che modo è più "sicuro"?
Julian Reschke,

4
perché è più difficile cambiare? puoi cambiare OTTIENI nella barra degli indirizzi, ma non è così facile con POST.
IAdapter,

8
Il server non può fidarsi del client. Progettare l'applicazione in base a presupposti falsi è tutt'altro che sicuro.
troelskn,

anche openid non viene salvato, perché può essere rotto?
IAdapter,

1
Credo che questa sia la spiegazione più chiara: la differenza nel posizionamento dei dati inviati. Grazie.
Greenoldman,

37

La migliore risposta è stata la prima.

Tu stai usando:

  • OTTIENI quando vuoi recuperare i dati (OTTIENI DATI).
  • POST quando si desidera inviare dati (DATI POST).

2
Qual è il modello di servizio di richiesta / risposta utilizzato e si desidera fare entrambe le cose? ;) Preferirei utilizzare POST nella maggior parte dei casi quando ho bisogno di una risposta.
Dmitry Pavlov il

8
In genere è vero. GETè anche perfettamente in grado di "inviare" dati, quindi non è una risposta molto accurata.
Patrick Hofman,

23

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 GETha a che fare con la GETregistrazione 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 GETrichieste 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.

POSTrichiede 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 HTTPutilizzandolo 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.


17

Uso GET quando recupero informazioni da un URL e POST quando invio informazioni a un URL.


1
ma puoi anche usare GET per inviare. La differenza è nel formato (nell'URL (GET) o nella richiesta (POST)).
eric,

Se l'endpoint accetta un file e restituisce una riga dal file (nessuna creazione o modifica di dati o database è coinvolto), l'endpoint dovrebbe essere GET o POST?
variabile

17

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).


Se l'endpoint accetta un file e restituisce una riga dal file (nessuna creazione o modifica di dati o database è coinvolto), l'endpoint dovrebbe essere GET o POST?
variabile

@variable POST. In questo caso, principalmente perché POST è costruito per gestire i caricamenti di file e GET standard no. Dovresti inviare il file ogni volta che la pagina viene caricata, quindi ha senso utilizzare solo il POST standard anziché il file GET +, il che spezzerebbe l'aspettativa di GET che un URL dovrebbe fornire più o meno gli stessi risultati ogni volta.
Concedi il

14

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.

9
Penso che possa essere ulteriormente riassunto in questo modo: OTTIENI quando lo stato del server non viene modificato, POST quando lo è.
Yamcha,

10

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.


8

Il motivo per utilizzare POST quando si apportano modifiche ai dati:

  • Un acceleratore web come Google Web Accelerator farà clic su tutti i collegamenti (GET) su una pagina e li memorizzerà nella cache. Questo è molto male se i collegamenti apportano modifiche alle cose.
  • Un browser memorizza nella cache le richieste GET, quindi anche se l'utente fa clic sul collegamento, potrebbe non inviare una richiesta al server per eseguire la modifica.
  • Per proteggere il tuo sito / applicazione da CSRF devi usare POST. Per proteggere completamente la tua app, devi anche generare un identificatore univoco sul server e inviarlo insieme nella richiesta.

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.


8

GETe POSTsono metodi HTTP che possono raggiungere obiettivi simili

GETè fondamentalmente solo per ottenere (recuperare) dati, A GETnon 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 POSTfatto che i dati inviati fanno parte di l'URL

Non utilizzare mai GETquando 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.

POSTpuò comportare qualsiasi cosa, come l'archiviazione o l'aggiornamento dei dati, l'ordinazione di un prodotto o l'invio di e-mail. POSTil metodo ha un corpo.

POSTil 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. POSTil metodo non può essere aggiunto ai segnalibri


3
  1. Il metodo GET viene utilizzato per inviare i dati meno sensibili mentre il metodo POST viene utilizzato per inviare i dati sensibili.
  2. Utilizzando il metodo POST è possibile inviare una grande quantità di dati rispetto al metodo GET.
  3. I dati inviati dal metodo GET sono visibili nella barra dell'intestazione del browser, mentre i dati inviati dal metodo POST sono invisibili.

0

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.


-10

Il GETmetodo:

  • 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 POSTmetodo:

  • Viene utilizzato per l'invio di dati illimitati.

  • Con questo metodo, le informazioni non possono essere visualizzate sul browser

  • Puoi menzionare esplicitamente il POSTmetodo

  • È più sicuro del GETmetodo

  • Fornisce funzionalità più avanzate


"Viene utilizzato solo per l'invio di una data di 256 caratteri" - non vero. "Quando si utilizza questo metodo, le informazioni possono essere visualizzate sul browser": i dati dei post sono visibili anche nei browser, ma non sono così evidenti. "Fornisce funzionalità più avanzate" - come?
Quentin,

Questa non è una risposta terribilmente utile. Informazioni errate come "non è così sicuro" e "fornisce funzionalità più avanzate" e altre cose menzionate da Quentin.
Andrew Barber,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.