La sicurezza riguarda l'HTTP GET nello sviluppo Web

-1

Attualmente sono uno sviluppatore che fa la mia prima incursione nello sviluppo web, principalmente utilizzando servizi C # ASP.NET come MVC e Web API. Entrando nel lato HTTP delle cose, attualmente sto decidendo se usare o meno POST o GET quando accedo ai miei modelli di dati.

Ovviamente, utilizzerei il POST quando il mio livello di repository comunica con le origini dati, ma quando suppongo che il mio controller analizzerà l'input dell'utente (essendo questa un'app web frontale), mi sono innervosito a pensare passare valori di informazione un po 'sensibili su HTTP GET, visto che verrebbero inseriti attraverso l'URL. Ricordando in educazione quanto i pericoli di SQL Injection sono stati battuti in noi, ho una (infondata) impressione che dovrei usare il POST solo quando accedo al mio repository che comunica con i miei database.

Sono corretto nel presupporre che ci siano problemi di sicurezza validi con l'utilizzo di GET HTTP per inviare parametri a un livello di repository che comunica con i miei database?

Ovviamente, applicheremo la convalida a entrambe le estremità, ma mi sembra che GET abbia una gamma di attacchi più ampia rispetto al POST. Mi piacerebbe che la mia convalida fosse stretta e rigorosa.

    
posta nostalgk 18.07.2018 - 14:55
fonte

4 risposte

5
  • Oltre le connessioni TLS (https), entrambi i dati POST e GET sono crittografati, quindi non c'è alcuna differenza in proposito.
  • Per evitare problemi di SQL injection (o altri), devi convalidare e disinfettare tutto l'input dell'utente in entrata, indipendentemente dal fatto che sia stato utilizzato POST o GET.
  • Inerentemente, l'utilizzo delle richieste POST non è più sicuro , ma è buona norma utilizzare le richieste POST quando si inviano dati che modificano (ad esempio) qualcosa nel database.
  • Se si utilizza GET, esiste un rischio maggiore che gli strumenti di registrazione del server registrino anche le informazioni riservate per impostazione predefinita (il registro delle richieste HTTP conterrà tutti i dati). Puoi minimizzare questo rischio inviando i dati con POST.

  • Inoltre, in alcuni scenari (a seconda dell'utilizzo e delle esigenze specifici), le informazioni sensibili nell'URL come parametri di query (ad esempio /data/something?secret_key=123321 ) verranno anche memorizzate nella cronologia del browser e ciò potrebbe essere un rischio se i computer condivisi sono comuni per i tuoi utenti.

risposta data 18.07.2018 - 15:13
fonte
1

Sembra che tu stia combinando diversi problemi in termini di sicurezza. Ci sono alcuni problemi con l'utilizzo dei parametri GET, sebbene questi non siano specificamente correlati all'iniezione SQL e l'iniezione SQL non può essere prevenuta usando solo le richieste POST.

La maggior parte dei problemi con le richieste GET deriva dall'accesso indiretto ai dati: ad esempio, i parametri GET possono essere visualizzati nella cronologia del browser e memorizzati nei file di registro lato server senza alcuna elaborazione aggiuntiva. Le richieste POST, d'altra parte, vengono solitamente visualizzate nella cronologia del browser senza valori di parametro e i registri del server di solito non includono il corpo delle richieste.

SQLi, d'altra parte, risulta dall'utilizzo di dati non affidabili nel contesto di una query SQL. Non importa da dove provengano i dati: richiesta GET, richiesta POST, altro sistema di backend, cookie, il database stesso.

Generalmente è buona pratica applicare rigorosamente metodi di richiesta specifici, ma è meglio evitare altri tipi di difetti (le versioni precedenti di PHP unirebbero le variabili GET e POST, ad esempio, causando problemi in cui i valori previsti potrebbero essere sovrascritti da fornire un parametro inserito dall'utente dell'altro tipo). Un paradigma per questo sta seguendo i metodi REST ( link ) in cui ogni metodo HTTP si associa a un tipo di azione, quindi solo richieste GET recupera i dati, le richieste POST creano i dati, PUT richiede i dati di aggiornamento e le richieste DELETE eliminano i dati, ma questo non ha sempre senso per tutte le applicazioni (ad esempio dove fare richieste PUT / DELETE non è possibile per qualche motivo).

    
risposta data 18.07.2018 - 15:12
fonte
0

Per aggiungere alle risposte eccessive senza troppe sovrapposizioni, la preoccupazione per gli URL non è infondata e ci sono specifiche raccomandazioni per questo: "Nelle richieste GET i dati sensibili devono essere trasferiti in un'intestazione HTTP"

Come notato nel mio commento su un'altra risposta, qualsiasi cosa fatta con GET deve essere idempotente e sicuro .

    
risposta data 18.07.2018 - 22:57
fonte
0

GET e POST (lunghi con PUT, DELETE e PATCH) hanno ruoli funzionali molto specifici , ridefinendo la semantica di questi non è qualcosa da prendere senza un'attenta considerazione.

Anche quando si utilizza il POST, se si seguono le convenzioni REST, vi sono informazioni transazionali significative all'interno dell'URL.

Se utilizzi qualsiasi tipo di contenuto transazionale o contenuto che richiede l'autenticazione, devi utilizzare HTTPS. Questo (principalmente) riguarda la riservatezza dei dati in transito. I tuoi problemi rimanenti sono agli endpoint. Presumibilmente il lato server non è un problema. Sul client, i dati rimarranno nella cronologia del dispositivo ma solo per gli URL a cui l'utente ha navigato - XMLHttpRequests non popola la cronologia a meno che tu inserisce esplicitamente i dati .

I browser sono relativamente bravi a partizionare i dati appartenenti a siti separati - ma ci sono vari canali che possono far trapelare informazioni ad un determinato utente malintenzionato ma questi sono tutti (AFAIK) nel dominio dei dati statici - nomi host, certificati, stato HSTS, cache dei contenuti ... la cronologia del browser non è uno di questi.

Quindi, a parte il modello di minaccia di qualcuno che si impadronisce del dispositivo di un utente ed estrae i dati dal filesystem, non c'è differenza tra un GET e un POST dal punto di vista della sicurezza.

Serverside, la sua pratica comune per registrare l'intero URL, quindi ti consigliamo di acquistare protezioni simili ai tuoi dati di registro come fai con i dati transazionali.

    
risposta data 18.07.2018 - 23:00
fonte

Leggi altre domande sui tag