Una stringa di query HTTPS è sicura?


351

Sto creando un'API sicura basata sul Web che utilizza HTTPS; tuttavia, se consento agli utenti di configurarlo (includendo l'invio della password) utilizzando una stringa di query, anche questo sarà sicuro o dovrei forzarlo per mezzo di un POST?

Risposte:


453

Sì. Ma usare GET per dati sensibili è una cattiva idea per diversi motivi:

  • Per lo più perdita di referrer HTTP (un'immagine esterna nella pagina di destinazione potrebbe perdere la password [1])
  • La password verrà archiviata nei registri del server (il che è ovviamente negativo)
  • Cache della cronologia nei browser

Pertanto, anche se Querystring è protetto, non è consigliabile trasferire dati sensibili su querystring.

[1] Anche se devo notare che RFC afferma che il browser non dovrebbe inviare referrer da HTTPS a HTTP. Ma ciò non significa che una cattiva barra degli strumenti del browser di terze parti o un'immagine / flash esterni da un sito HTTPS non lo perderanno.


4
Che dire di https ai referrer https ? Se ricevo un'immagine da un sito di terze parti utilizzando https? Il browser invierà l'intera stringa di query dalla mia precedente richiesta al server di terze parti?
Jus12

4
@ Jus12 sì, non ha senso, ma è così che è stato progettato.
dott. male il

2
Allora perché la specifica OAuth2 non è consigliata per inviare dati sensibili nei parametri di query (nell'URL)? Anche se si consiglia di utilizzare sempre TLS (HTTPS). Fare riferimento all'ultimo punto in tools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3 CC @volka
gihanchanuka

@ dr.evil Potresti per favore elaborare qual è il problema History caches in browserso aggiungere qualche riferimento per ir?
LCJ,

1
Per completare la risposta con informazioni aggiornate: securitynewspaper.com/2016/08/01/… (l'hacking PAC proxy consente l'intercettazione degli URL HTTPS)
Tom

78

Da un punto di vista "sniff il pacchetto di rete" una richiesta GET è sicura, poiché il browser stabilirà prima la connessione protetta e quindi invierà la richiesta contenente i parametri GET. Ma gli URL GET verranno archiviati nella cronologia / completamento automatico del browser degli utenti, il che non è un buon posto in cui archiviare, ad esempio, i dati della password. Naturalmente questo vale solo se si prende la definizione più ampia di "Webservice" che potrebbe accedere al servizio da un browser, se accedete solo dall'applicazione personalizzata, questo non dovrebbe essere un problema.

Quindi dovrebbe essere preferito usare post almeno per le finestre di dialogo della password. Inoltre, come sottolineato nel link littlegeek pubblicato, è più probabile che un URL GET venga scritto nei log del server.


48

, le stringhe di query verranno crittografate.

Il motivo alla base è che le stringhe di query fanno parte del protocollo HTTP che è un protocollo a livello di applicazione, mentre la parte di sicurezza (SSL / TLS) proviene dal livello di trasporto. Prima viene stabilita la connessione SSL e quindi i parametri della query (che appartengono al protocollo HTTP) vengono inviati al server.

Quando si stabilisce una connessione SSL, il client eseguirà i seguenti passaggi in ordine. Supponiamo che tu stia tentando di accedere a un sito chiamato example.com e desideri inviare le tue credenziali utilizzando i parametri della query. L'URL completo potrebbe essere simile al seguente:

https://example.com/login?username=alice&password=12345)
  1. Il tuo client (ad es. Browser / app mobile) risolverà innanzitutto il tuo nome di dominio example.comin un indirizzo IP (124.21.12.31)utilizzando una richiesta DNS. Quando si interrogano tali informazioni, vengono utilizzate solo le informazioni specifiche del dominio, ovvero solo example.com.
  2. Ora, il client tenterà di connettersi al server con l'indirizzo IP 124.21.12.31e tenterà di connettersi alla porta 443 (porta del servizio SSL non la porta HTTP 80 predefinita).
  3. Ora, il server at example.cominvierà i suoi certificati al tuo client.
  4. Il client verificherà i certificati e inizierà a scambiare una chiave segreta condivisa per la sessione.
  5. Dopo aver stabilito correttamente una connessione protetta, solo allora i parametri della query verranno inviati tramite la connessione protetta.

Pertanto, non esporrai dati sensibili. Tuttavia, l'invio delle credenziali su una sessione HTTPS utilizzando questo metodo non è il modo migliore. Dovresti optare per un approccio diverso.


2
Ma vedi la risposta di @dr. male, la stringa di cava potrebbe finire in file di registro e cache, quindi potrebbe non essere sicura sul server.
zaph,

3
Ciao zaph, in termini di sicurezza HTTPS, l'obiettivo è di inviare i dati in modo sicuro al server senza che nessuno nel mezzo sia in grado di annusare i dati. Sebbene ciò sia possibile e risponda alla domanda, è davvero difficile controllare cosa fa il server in seguito. Ecco perché ho anche menzionato che questo non è il modo corretto. In aggiunta a ciò, non dovresti mai inviare la tua password dal client. Dovresti sempre eseguire l'hashing sul dispositivo e inviare il valore hash al server.
Ruchira Randana,

Dal punto di vista della sicurezza l'invio di informazioni riservate nella stringa di cava non è sicuro, è consigliabile inviarlo in un POST. Inoltre, la password viene generalmente l'hash sul server, non dal client. L'affermazione "non si dovrebbe mai inviare ur password dal client" è in conflitto con la risposta: (e.g http://example.com/login?username=alice&password=12345).
zaph,

L'hash di @RuchiraRandana sul client è inutile perché la chiave privata può essere facilmente recuperata dal front-end.
James W,

@JamesW " la chiave privata viene quindi facilmente recuperata dal front-end " Quale chiave?
curiousguy,

28

Sì. L'intero testo di una sessione HTTPS è protetto da SSL. Ciò include la query e le intestazioni. A tale proposito, un POST e un GET sarebbero esattamente gli stessi.

Per quanto riguarda la sicurezza del tuo metodo, non c'è modo reale di dirlo senza un'ispezione adeguata.


27
C'è di più nella sicurezza oltre alla semplice comunicazione tra browser e server
JoeBloggs,

26

SSL si collega prima all'host, quindi il nome host e il numero di porta vengono trasferiti come testo in chiaro. Quando l'host risponde e la sfida ha esito positivo, il client crittograferà la richiesta HTTP con l'URL effettivo (ovvero qualsiasi cosa dopo la terza barra) e la invierà al server.

Esistono diversi modi per violare questa sicurezza.

È possibile configurare un proxy per agire come un "uomo in mezzo". Fondamentalmente, il browser invia la richiesta per connettersi al server reale al proxy. Se il proxy è configurato in questo modo, si connetterà tramite SSL al server reale ma il browser continuerà a parlare con il proxy. Pertanto, se un utente malintenzionato può accedere al proxy, può vedere tutti i dati che lo attraversano in chiaro.

Le tue richieste saranno anche visibili nella cronologia del browser. Gli utenti potrebbero essere tentati di aggiungere il sito ai preferiti. Alcuni utenti hanno installato gli strumenti di sincronizzazione dei segnalibri, quindi la password potrebbe finire su deli.ci.us o in qualche altro posto.

Infine, qualcuno potrebbe aver violato il tuo computer e aver installato un registratore di tastiere o uno screen raschiatore (e molti virus di tipo Trojan Horse lo fanno). Poiché la password è visibile direttamente sullo schermo (anziché "*" nella finestra di dialogo della password), questa è un'altra falla di sicurezza.

Conclusione: quando si tratta di sicurezza, fare sempre affidamento sul sentiero battuto. C'è troppo che non sai, che non ti verrà in mente e che ti spezzerà il collo.


3
"il browser continuerà a parlare con il proxy" non è del tutto vero, dovrà presentare al browser un certificato valido che il proxy può generare solo se ha il controllo su una CA di cui il browser si fida.
Pieter,


10

Non sono d'accordo con l'affermazione sulla perdita [...] di referrer HTTP (un'immagine esterna nella pagina di destinazione potrebbe perdere la password) nella risposta di Slough .

HTTP 1.1 RFC afferma esplicitamente :

I client NON DOVREBBERO includere un campo di intestazione Referer in una richiesta HTTP (non sicura) se la pagina di riferimento è stata trasferita con un protocollo sicuro.

Comunque, i log del server e la cronologia del browser sono motivi più che sufficienti per non inserire dati sensibili nella stringa di query.


2
C'è di nuovo quella parola "dovrebbe". Ti fideresti di ogni versione di ogni browser con la tua password?
JoeBloggs,

1
In che modo è esattamente correlato a GET vs POST? "Ogni versione di ogni browser" sarebbe sicura se si utilizza POST su HTTPS?
Arnout,

2
Inoltre, la pagina web HTTPS potrebbe recuperare un'immagine esterna su HTTPS - nel qual caso, il browser DOVREBBE includere l'intestazione del referer e quindi esporre la tua password ...
AviD

3
@Arnout: per favore leggi questo RFC che ti dice cosa NON DOVREBBE significare: ietf.org/rfc/rfc2119.txt NON È lo stesso di DEVE, quindi la parte che hai citato non è veramente rilevante e gli agenti del browser potrebbero ancora includere un referer a HTTP.
Andy,

8

Sì, dal momento in cui stabilisci una connessione HTTPS tutto è sicuro. La stringa di query (GET) come POST viene inviata su SSL.


-4

È possibile inviare la password come parametro hash MD5 con aggiunta di sale. Confrontalo sul lato server per auth.


11
MD5 non è una funzione hash adatta per le password.
slawek,

1
Con hash o in chiaro, è una cattiva pratica inviare password all'interno dei parametri GET. Per le spiegazioni, fare riferimento alla risposta più votata. Aaaand ... MD5 non dovrebbe più essere usato da nessuna parte ...
Thomas,

" Funzione hash non adatta per le password " Ancora meglio dell'invio di password in chiaro al server, lol
curiousguy,
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.