Domanda

Ho lavorato attraverso esercitazioni ASP.NET MVC di Microsoft, finendo a questa pagina

http://www.asp.net/learn/mvc/ tutorial-32-cs.aspx

La seguente dichiarazione è fatta verso la parte inferiore di questa pagina:

  

In generale, non si desidera eseguire un'operazione HTTP GET quando si invoca un'azione che modifica lo stato della vostra applicazione web. Quando si esegue un'operazione di eliminazione, si desidera eseguire un HTTP POST, o meglio ancora, un HTTP operazione di cancellazione.

E 'vero? Chiunque può offrire una spiegazione più dettagliata per la logica alla base di questa affermazione?

Modifica

Wikipedia afferma quanto segue:

  

Alcuni metodi (ad esempio, HEAD, GET, OPZIONI e TRACE) sono definiti come sicuro, il che significa che sono destinati solo per il recupero delle informazioni e non dovrebbe cambiare lo stato del server.

     

Al contrario, metodi come POST, PUT e DELETE sono destinati ad azioni che possono causare effetti collaterali sia sul server

È stato utile?

Soluzione

La risposta di Jon Skeet è la risposta canonica. Ma: Supponiamo di avere un link:

href = "\myApp\DeleteImportantData.aspx?UserID=27"

e il google-bot arriva e gli indici la pagina? Cosa succede allora?

Altri suggerimenti

GET è convenzionalmente privo di effetti collaterali - in altre parole, non cambia lo stato. Ciò significa che i risultati possono essere memorizzati nella cache, i segnalibri possono essere effettuate in modo sicuro, ecc.

HTTP 1.1 RFC 2616

  

Implementors dovrebbero essere consapevoli che il   software rappresenta l'utente nel loro   le interazioni su Internet, e   deve fare attenzione per consentire all'utente di   essere a conoscenza di eventuali azioni che potrebbero   prendere che può avere un inaspettato   significato per sé o per altri.

     

In particolare, la convenzione è stata   stabilito che il GET e HEAD   metodi non dovrebbe avere il   importanza di compiere un'azione altro   di recupero. Questi metodi dovrebbero   essere considerato "sicuro". Questo permette all'utente   agenti per rappresentare altri metodi,   come POST, PUT e DELETE, in un   modo speciale, in modo che l'utente è composta   consapevole del fatto che un possibilmente   si chiede situazioni di pericolo.

     

Naturalmente, non è possibile   assicurarsi che il server non lo fa   generare effetti collaterali come risultato di   l'esecuzione di una richiesta GET; infatti,   alcune risorse dinamici ritengono che una   caratteristica. La distinzione importante   qui è che l'utente non ha richiesto   gli effetti collaterali, in modo quindi non può   essere ritenuti responsabili per loro.

A parte le questioni purista intorno essere idempotente, c'è un lato pratico: ragni / bot / crawler ecc seguiranno collegamenti ipertestuali. Se avete la vostra azione "cancella" come un collegamento ipertestuale che fa un GET, allora Google può allegramente eliminare tutti i dati. Vedere " Il Ragno di Doom ".

Con i messaggi, questo non è un rischio.

Un altro esempio ..

http://example.com/admin/articles/delete/2

Questo eliminerà l'articolo se si è connessi e disporre dei privilegi di destra. Se il tuo sito accetta commenti per esempio, e un utente sostiene che collegamento come un'immagine; in questo modo:

<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>

Poi, quando si te stesso come l'utente admin venire a sfogliare i commenti sul vostro sito il browser tenterà di recuperare l'immagine inviando fuori una richiesta in tal URL. Ma perché si è connessi, mentre il browser sta facendo questo l'articolo otterrà cancellato.

Si può anche non notare, senza guardare il codice sorgente maggior parte dei browser mostrano solito nulla se non riesce a trovare un'immagine.

La speranza che abbia un senso.

Si prega di vedere la mia risposta qui . Si applica anche a questa domanda.

  
      
  • Prefetch: Un sacco di browser userà prelettura. Che significa   che caricherà una pagina prima di   clicca sul link. anticipando che   si clicca su questo link più tardi.
  •   
  • Motori di ricerca: Ci sono diversi bot che la scansione e indice di Internet per la   informazione. Emetterà GET solo   richieste. Se non si desidera eliminare   qualcosa da una richiesta GET per questo   ragione.
  •   
  • Caching: GET HTTP richieste non sono tenuti a cambiare stato e dovrebbero essere idempotente. Idempotente significa che   emettere una richiesta volta, o che lo rilascia   più volte dà lo stesso risultato.   Cioè Non ci sono effetti collaterali. Per   questo motivo GET richieste HTTP sono   strettamente legato alla cache.
  •   
  • HTTP standard dice : Lo standard HTTP dice ciò che ogni metodo HTTP è   per. Diversi programmi sono costruiti per   utilizzare lo standard HTTP, e assumono   che si intende utilizzare come sei   suppone. Così si avrà   comportamento non definito da un gran numero di   programmi casuali se non seguono.
  •   

Oltre a ragni e le richieste di dover essere idempotente c'è anche un problema di sicurezza con richieste GET. Qualcuno può facilmente inviare agli utenti un messaggio e-mail con il

<img src="http://yoursite/Delete/Me" />

nel testo e il browser sarà lieto di andare avanti e cercare di accedere alla risorsa. Utilizzando POST non è una cura per queste cose (come si può mettere insieme un post modulo in javascript abbastanza facilmente), ma è un buon inizio.

A proposito di questo argomento (utilizzo metodi HTTP), vi consiglio di leggere questo post del blog: http://blog.codevader.com/2008/11/02/why-learning-http-does-matter/

Questo è in realtà il problema opposto: perché non utilizzare POST quando i dati non viene modificato.

Diciamo che abbiamo un programma di internet banking e visitiamo la pagina di trasferimento. L'utente connesso sceglie di trasferire $ 10 a un altro account.

Cliccando sulle redirect pulsante Invia (come una richiesta GET) per https: //my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j

Ma la connessione internet è lenta e / o il server (s) è (sono) occupato in modo dopo aver colpito il pulsante di invio della nuova pagina si sta caricando lento.

L'utente si sente frustrato e comincia a colpire F5 (refresh della pagina) furiosamente. Indovinate che cosa accadrà? Più di un trasferimento si verifica eventualmente svuotare account dell'utente.


Ora, se la domanda è presentata come POST (o qualsiasi altra cosa che GET) il primo F5 (refresh della pagina) che l'utente farà il browser sarà gentilmente chiedere "sei sicura di volerlo fare? Può avere effetti collaterali [ bla bla bla] ... "

Oltre a tutte le ottime ragioni di cui sopra qui, GET richieste potrebbero essere registrati dal server del destinatario, come ad esempio nel access.log. Se si invia attraverso i dati sensibili come le password nella richiesta, otterranno registrati in testo semplice.

Anche se sono hashing / salato per l'archiviazione sicura DB, una violazione (o qualcuno guardando sopra la spalla del ragazzo IT) li potrebbe rivelare. Tali dati dovrebbero andare nel corpo POST.

Un altro problema con GET è che il comando va a barra degli indirizzi del browser. Quindi, se si aggiorna la pagina, si emette nuovamente il comando, sia esso "cancella ultima roba", "invia l'ordine" o simili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top