it-swarm-eu.dev

Lo stesso JavaScript recuperato da HTTP e HTTPS verrà memorizzato nella cache separatamente dal browser?

Supponiamo che un server Web supporti sia HTTP che HTTPS. Se un browser recupera lo stesso JavaScript con un HTTP GET e un HTTPS GET e JavaScript è in grado di memorizzare nella cache, il browser memorizzerà nella cache due copie dello stesso JavaScript?

Il motivo per cui sto chiedendo è che se una sola copia viene memorizzata nella cache, sarebbe possibile per un utente malintenzionato indurre in primo luogo la vittima a scaricare JavaScript tramite HTTP e comprometterlo lungo il percorso, il che si tradurrà in un attacco di avvelenamento della cache?

42
SamTest

Le risorse sono memorizzate nella cache dal loro URL e dal protocollo (http:// o https://) fa parte dell'URL. Poiché il protocollo differisce, anche l'URL deve essere diverso e si hanno due voci di cache separate.

69
MSalters

Va perfettamente bene se un http:// e un https:// risorsa fornisce dati diversi, anche se tutto tranne il metodo di accesso è lo stesso. Ad esempio l'accesso a http:// genererà spesso una risposta di reindirizzamento durante l'accesso a https:// fornire il contenuto reale. Un browser memorizzerà quindi queste risorse in modo indipendente l'una dall'altra.

46
Steffen Ullrich

Sommario:

  • La chiave di cache primaria per qualsiasi browser conforme agli standard è un URI assoluto
  • L'URI assoluto inizia http: per tutte le richieste non sicure e https: per tutte le richieste sicure
  • Di conseguenza, una risorsa recuperata in modo sicuro non può mai utilizzare la stessa chiave di cache di una risorsa recuperata in modo non sicuro

L'attuale standard per HTTP è suddiviso su più documenti "RFC", con RFC 7234 interamente dedicato alla memorizzazione nella cache, poiché comporta molta complessità.

Nella sezione 2, "Panoramica del funzionamento della cache", è disponibile questo riepilogo:

La chiave di cache primaria è costituita dal metodo di richiesta e dall'URI di destinazione. Tuttavia, poiché oggi le cache HTTP di uso comune sono in genere limitate alla memorizzazione nella cache delle risposte a GET, molte cache semplicemente rifiutano altri metodi e usano solo l'URI come chiave cache primaria.

Questo è più formalmente dichiarato nel primo punto elenco nella sezione 4, che dice:

Quando viene presentata una richiesta, una cache NON DEVE riutilizzare una risposta memorizzata, a meno che [...] l'URI della richiesta effettiva presentata (Sezione 5.5 di RFC7230) quello della risposta memorizzata corrisponda [...]

Sezione 5.5 di RFC 72 inizia dicendo

Per un agente utente, l'URI della richiesta effettiva è l'URI di destinazione.

Un browser è un "agente utente", quindi questo è il caso che ci interessa qui. "URI target" è definito nella sezione 5.1 :

Un riferimento URI (Sezione 2.7) viene generalmente utilizzato come identificatore per la "risorsa di destinazione", che un agente utente risolverebbe nella sua forma assoluta per ottenere "URI di destinazione". L'URI di destinazione esclude l'eventuale componente di frammento del riferimento, poiché gli identificatori di frammento sono riservati per l'elaborazione lato client (RFC3986, Sezione 3.5).

La definizione generica di un URI è in RFC 3986 e le preoccupazioni specifiche per HTTP occupano tre pagine di RFC 7230. La parte più rilevante per i nostri scopi è RFC 3986 sezione 4.1 che definisce questa grammatica per gli URI assoluti:

absolute-URI = schema ":" hier-part ["?" query]

Fondamentalmente, nota che scheme è una parte obbligatoria di qualsiasi URI assoluto. Poiché gli URI HTTP usano sempre lo schema http e gli URI HTTPS usano sempre lo schema https, ciò significa che i loro URI assoluti, e quindi le loro "chiavi di cache primarie" in un browser, non possono mai scontrarsi.


Altre risposte hanno menzionato le porte. RFC 7230, Sezione 2.7.1 definisce http URI come includendo una sezione "autorità", che è definita in [RFC 3986, Sezione 3.2]:

autorità = [userinfo "@"] Host [":" port]

La porta è facoltativa, con RFC 7230, Sezione 2.7.1 che definisce il valore predefinito per lo schema URI http:

Se il sottocomponente della porta è vuoto o non specificato, TCP porta 80 (la porta riservata per i servizi WWW) è l'impostazione predefinita.

E la seguente sezione che definisce il valore predefinito per "https":

Tutti i requisiti sopra elencati per lo schema "http" sono anche requisiti per lo schema "https", tranne che TCP porta 443 è l'impostazione predefinita se il sottocomponente della porta è vuoto o non specificato, e ...

Segue quindi che:

  • Qualsiasi richiesta HTTP non sulla porta 80 deve includere un numero di porta nel suo URI assoluto
  • Qualsiasi richiesta HTTPS non sulla porta 443 deve includere un numero di porta nel suo URI assoluto
  • Non sono presenti due richieste con numeri di porta diversi con la stessa chiave cache, poiché avranno URI assoluti distinti

Pertanto questi URI verrebbero tutti memorizzati nella cache separatamente:

L'unica cosa su cui non sono chiaro è se il browser dovrebbe, potrebbe o debba normalizzare gli URI che menzionano esplicitamente la porta che sarebbe comunque l'impostazione predefinita. In altre parole, se questi due URI verranno memorizzati nella cache separatamente o meno:

Non riesco a pensare a nessuna conseguenza pratica della normalizzazione di questi nella stessa chiave di cache, perché dalle definizioni di cui sopra sono garantiti per rappresentare la stessa risorsa.

8
IMSoP

Sì, perché sono destinazioni di rete diverse. La porta tcp non viene visualizzata nella barra degli indirizzi quando si utilizza la porta standard.

Per impostazione predefinita, http è la porta tcp 80. Www.example.com:80

Https viene impostato automaticamente sulla porta tcp 443 Www.example.com:443

Anche se il dominio e l'ip sono uguali, le porte non lo sono. Dal punto di vista del browser, il browser sta comunicando con siti diversi.

[~ ~ #] aggiornamento [~ ~ #]

La rete non la influenza tanto quanto la S nella https. È anche un URI diverso.

2
Jonathan

Lasciando da parte il fatto che le specifiche sono abbastanza chiare sul fatto che URL diversi dovrebbero essere trattati come risorse diverse, non pensi che qualcuno potrebbe averlo notato e sfruttato ormai se non fosse così? Dopo che tutti i problemi esposti dai cookie (e risolti dal flag "sicuro") sono noti da 20 anni o più.

Quindi il browser deve recuperare entrambi gli URL. È ipotizzabile che una cache possa conservare una singola copia di un file scaricato da origini diverse ma a cui si accede tramite chiavi diverse o che questa de-duplicazione potrebbe verificarsi più in profondità nel filesystem (de-duplicazione). Ma questo accadrebbe solo dopo la cache (o il filesystem) aveva determinato che i file erano gli stessi.

2
symcbean

Sì, queste sono origini diverse. Sebbene sia molto probabile che offrano lo stesso contenuto, possono tecnicamente servire contenuti completamente diversi. Per questo motivo, al browser non è consentito trattarli come la stessa risorsa.

0
Aaron Cicali

Dal punto di vista lato server, lo stesso URL (ad es. Www.test.com) su protocolli diversi (ad es. HTTP vs HTTPS) può utilizzare un'origine file diversa. Quindi un URL con TLS può generare un sito Web completamente diverso dall'URL senza TLS. Questo da solo mi fa pensare che i browser non useranno la stessa cache per entrambi i file.

0
Martin