You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 3-frames-and-windows/03-cross-window-communication/article.md
+21-21Lines changed: 21 additions & 21 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,8 +1,8 @@
1
1
# Comuniaczione cross-window
2
2
3
-
La politcia di "Same Origin" ("stessa origine", ovvero stesso sito) limita il reciproco accesso tra finestre ed iframe diversi.
3
+
La politica di "Same Origin" ("stessa origine", ovvero stesso sito) limita il reciproco accesso tra finestre ed iframe diversi.
4
4
5
-
L'idea è che, se un utente ha deu pagine aperte: una su `john-smith.com`, ed un'altra su `gmail.com`, allora non vorrà che uno script ion esecuzione su `john-smith.com` possa leggere tutte le sue mail dalla finestra di `gmail.com`. Quindi, lo scopo della politica "Same Origin" è quello di proteggere l'utente dal furto di informazioni.
5
+
L'idea è che, se un utente ha due pagine aperte: una su `john-smith.com`, ed un'altra su `gmail.com`, allora non vorrà che uno script in esecuzione su `john-smith.com` possa leggere tutte le sue mail dalla finestra di `gmail.com`. Quindi, lo scopo della politica "Same Origin" è quello di proteggere l'utente dal furto di informazioni.
6
6
7
7
## Same Origin [#same-origin]
8
8
@@ -24,18 +24,18 @@ Questi invece no:
24
24
La politica di "Same Origin" afferma che:
25
25
26
26
- se abbiamo un riferimento ad un'altra finestra, ad esempio un popup creato tramite `window.open` oppure una finestra all'interno di un `<iframe>`, e queste finestre appartengono alla stessa origine, allora avremo pieno accesso ad esse.
27
-
- altrimenti, se queste provengono da origini differenti, allora non potremo accedere al cotenuto della finestra: variables, il suo document, e qualsiasi altra informazione. L'unica eccezione è sulla proprietà `location`: possiamo modificarla (reindirizzando l'utente). Ma non possiamo *leggerne* il contenuto (quindi non possiamo sapere in quale sito si trova l'utente in un dato momento, nessuna infromazione viene trapelata).
27
+
- altrimenti, se queste provengono da origini differenti, allora non potremo accedere al contenuto della finestra: variabili, il suo document, e qualsiasi altra informazione. L'unica eccezione è sulla proprietà `location`: possiamo modificarla (reindirizzando l'utente). Ma non possiamo *leggerne* il contenuto (quindi non possiamo sapere in quale sito si trova l'utente in un dato momento, nessuna infromazione viene trapelata).
28
28
29
29
### In azione: iframe
30
30
31
31
Un tag di `<iframe>` permette di incorporare una finestra separata, la quale avrà i suoi oggetti `document` e `window` separati.
32
32
33
33
Possiamo accedervi utilizzando le proprietà:
34
34
35
-
-`iframe.contentWindow` per ottenere il riferiemnto alla finestra all'interno di `<iframe>`.
35
+
-`iframe.contentWindow` per ottenere il riferimento alla finestra all'interno di `<iframe>`.
36
36
-`iframe.contentDocument` per ottenere il riferimento al document all'interno di `<iframe>`, abbreviazione per `iframe.contentWindow.document`.
37
37
38
-
Quando accediamo a qualche proprietà della finestra incorporata, il browser verificherà se l'iframe appartiene alla stessa origine. Se cosi non è, allora l'accesso verrà negatp (rimane l'eccezione sulla scrittura di `location`, che è comunque permessa).
38
+
Quando accediamo a qualche proprietà della finestra incorporata, il browser verificherà se l'iframe appartiene alla stessa origine. Se cosi non è, allora l'accesso verrà negato (rimane l'eccezione sulla scrittura di `location`, che è comunque permessa).
39
39
40
40
Ad esempio, proviamo a leggere e scrivere su un `<iframe>` da un'altra origine:
41
41
@@ -44,7 +44,7 @@ Ad esempio, proviamo a leggere e scrivere su un `<iframe>` da un'altra origine:
44
44
45
45
<script>
46
46
iframe.onload=function() {
47
-
// possiamo ottenere il riferiemento alla finestra integrata
47
+
// possiamo ottenere il riferimento alla finestra integrata
48
48
*!*
49
49
let iframeWindow =iframe.contentWindow; // OK
50
50
*/!*
@@ -106,7 +106,7 @@ L'evento di `iframe.onload` (nel tag `<iframe>`) equivale a `iframe.contentWindo
106
106
107
107
Per definizione, due URL con domini differenti appartengono ad origini differenti.
108
108
109
-
Ma se le due finestre condividono lo stesso dominio di secondo livello, ad esempio `john.site.com`, `peter.site.com` e `site.com` (il loro dominio di secondo livello comunue è `site.com`), possiamo far si che il browser ignori la differenza, in questo modo verrannop trattate come se provenissero dalla "stessa origine", per gli scopi della comunicazione tra finestre.
109
+
Ma se le due finestre condividono lo stesso dominio di secondo livello, ad esempio `john.site.com`, `peter.site.com` e `site.com` (il loro dominio di secondo livello comune è `site.com`), possiamo far si che il browser ignori la differenza, in questo modo verranno trattate come se provenissero dalla "stessa origine", per gli scopi della comunicazione tra finestre.
110
110
111
111
Per far si che questo funzioni, ogni finestra dovrà eseguire il seguente codice:
112
112
@@ -118,9 +118,9 @@ Questo è tutto. Da questo momento in poi potranno interagire senza limitazioni.
118
118
119
119
## Iframe: il tranello del document errato
120
120
121
-
Quando un iframe appartine alla stessa origine, con la possibilità quindi di accere al suo `document`, c'è un piccolo tranello a cui prestare attenzione. Non è strettamente legato al cross-origin, ma è comunque importante esserne a consocenza.
121
+
Quando un iframe appartiene alla stessa origine, con la possibilità quindi di accedere al suo `document`, c'è un piccolo tranello a cui prestare attenzione. Non è strettamente legato al cross-origin, ma è comunque importante esserne a conoscenza.
122
122
123
-
Al momento della creazione, un iframe genera immediatamente un docuement. Ma quest utlimo è diverso da quello che verrà caricato internamente!
123
+
Al momento della creazione, un iframe genera immediatamente un document. Ma quest ultimo è diverso da quello che verrà caricato internamente!
124
124
125
125
Quindi, se qualsiasi operazione effettuata sul document negli istanti dopo al creazione, andrà probabilmente persa.
126
126
@@ -146,7 +146,7 @@ Dovremmo evitare di effettuare operazioni sul document di un iframe non ancora c
146
146
147
147
Come possiamo assicurarci che il document sia quello corretto?
148
148
149
-
Per essere sicuri di lavorare con il document corretto, dovremmo attendere fin quando verrà emesso l'evento `iframe.onload`. Il quale verrà innescato solemente una volta che l'iframe avrà caricato tutte le risorse.
149
+
Per essere sicuri di lavorare con il document corretto, dovremmo attendere fin quando verrà emesso l'evento `iframe.onload`. Il quale verrà innescato solamente una volta che l'iframe avrà caricato tutte le risorse.
150
150
151
151
Possiamo provare ad intercettarlo anticipatamente effettuando controlli all'interno di un `setInterval`:
L'attributo `sandbox` permette l'esclusione di determinate azioni all'interno di un `<iframe>`, in modo da prevenire l'esecuzione di codice non affidabile. Consente di "isolare" ("sandbox") l'iframe, facendo si che venga trattato come se appartenesse ad un origine diversa e/o applicando altre limitazioni.
216
216
217
-
Ci sono una serie di restriozioni "applicate di default" per un `<iframe sandbox src="...">`. Ma possono essere disattivate esplicitamente fornendo, come valore dell'attributo, la lista delle restrizioni da non applicare separate da un carettere di spazio, in questo modo: `<iframe sandbox="allow-forms allow-popups">`.
217
+
Ci sono una serie di restrizioni "applicate di default" per un `<iframe sandbox src="...">`. Ma possono essere disattivate esplicitamente fornendo, come valore dell'attributo, la lista delle restrizioni da non applicare separate da un carattere di spazio, in questo modo: `<iframe sandbox="allow-forms allow-popups">`.
218
218
219
219
In altre parole, un attributo `"sandbox"` vuoto, applica tutte le restrizioni, ma possiamo fornirgli la lista di quelle che vogliamo disattivare, separandole con uno spazio.
220
220
221
221
Di seguito la lista delle limitazioni:
222
222
223
223
`allow-same-origin`
224
-
: Di default l'attributo `"sandbox"` forza la politica di "diversa origine" per un iframe. In altre parole, fa si che il browser trati l'`iframe` come se appartenesse ad un origine diversa, anche se in realtà il suo `src` sta puntando allo stesso sito. Con tutte le relative implicazioni viste prima. Questa opzione, disabilita la restrizione.
224
+
: Di default l'attributo `"sandbox"` forza la politica di "diversa origine" per un iframe. In altre parole, fa si che il browser tratti l'`iframe` come se appartenesse ad un origine diversa, anche se in realtà il suo `src` sta puntando allo stesso sito. Con tutte le relative implicazioni viste prima. Questa opzione, disabilita la restrizione.
225
225
226
226
`allow-top-navigation`
227
227
: Permette all'iframe` di cambiare `parent.location`.
@@ -233,7 +233,7 @@ Di seguito la lista delle limitazioni:
233
233
: Permette l'esecuzione di script dall'`iframe`.
234
234
235
235
`allow-popups`
236
-
: Permette all'`iframe` l'apertura di finestre di poopup tramite `window.open`
236
+
: Permette all'`iframe` l'apertura di finestre di popup tramite `window.open`
237
237
238
238
Consulta [il manuale](mdn:/HTML/Element/iframe) per maggiori informazioni.
239
239
@@ -252,7 +252,7 @@ Lo scopo dell'attributo `"sandbox"` è solamente quello di *aggiungere più* res
252
252
253
253
L'interfaccia `postMessage` permette alle finestre di comunicare indistintamente dall'origine di appartenenza.
254
254
255
-
Quindi, è di fatto un modo per aggirare la politica di "Same Origin". Consente infatti ad una finestra proveniente da `john-smith.com` di comunicare con `gmail.com` e scambiarsi informazioni, ma solamente nel caso in cui entrambe acconsentono questo comportamento ed invocano le rispettive funzoni JavaScript. Questo rende il meccaniscmo di comunicazione tra finestre sicuro per l'utente.
255
+
Quindi, è di fatto un modo per aggirare la politica di "Same Origin". Consente infatti ad una finestra proveniente da `john-smith.com` di comunicare con `gmail.com` e scambiarsi informazioni, ma solamente nel caso in cui entrambe acconsentono questo comportamento ed invocano le rispettive funzioni JavaScript. Questo rende il meccaniscmo di comunicazione tra finestre sicuro per l'utente.
256
256
257
257
L'interfaccia è composta da due parti.
258
258
@@ -263,7 +263,7 @@ La finestra che vuole inviare un messaggio invoca il metodo [postMessage](mdn:ap
263
263
Argomenti:
264
264
265
265
`data`
266
-
: I dati da inviare. Possono essere un qualsiasi oggetto, che verrà poi duplicato utilizzando "l'algorito di serializzazione strutturato". IE supporta solamente stringhe, quindi dovremo utilizzare `JSON.stringify` per supportarlo.
266
+
: I dati da inviare. Possono essere un qualsiasi oggetto, che verrà poi duplicato utilizzando "l'algoritmo di serializzazione strutturato". IE supporta solamente stringhe, quindi dovremo utilizzare `JSON.stringify` per supportarlo.
267
267
268
268
`targetOrigin`
269
269
: Specifica l'origine per al finestra target, in questo modo il messaggio verrà ricevuto solamente dalla giusta finestra.
@@ -337,7 +337,7 @@ Ecco l'esempio completo:
337
337
338
338
## Riepilogo
339
339
340
-
Per poter invocare metodi ed accedere al contenuto di un'altra finestra, dobbiamo come prima cosa ottenere un riferimeto ad essa.
340
+
Per poter invocare metodi ed accedere al contenuto di un'altra finestra, dobbiamo come prima cosa ottenere un riferimento ad essa.
341
341
342
342
Per le finestre di popup abbiamo i seguenti riferimenti:
343
343
- Dalla finestra che innesca l'apertura: `window.open`, consente di aprire una nuova finestra e ne ritorna il riferimento,
@@ -355,7 +355,7 @@ Altrimenti, le uniche azioni possibili saranno:
355
355
- Inviare un messaggio.
356
356
357
357
Le uniche eccezioni sono:
358
-
-Finestere che condividono lo stesso dominio di secondo livello: `a.site.com` e `b.site.com`. E che abbiamo entrambe impostato: `document.domain='site.com'`. In questo caso verranno intepretate come appartenenti alla stessa origine.
358
+
-Finestre che condividono lo stesso dominio di secondo livello: `a.site.com` e `b.site.com`. E che abbiamo entrambe impostato: `document.domain='site.com'`. In questo caso verranno interpretate come appartenenti alla stessa origine.
359
359
- Se un iframe possiede l'attributo `sandbox`, allora questo verrà forzato ad uno stato di "origine differente", a meno che non venga esplicitamente disattivato passando come valore dell'attributo `allow-same-origin`. In questo caso verrà permessa l'esecuzione di codice esterno all'interno dell'iframe (se appartengono alla stessa origine).
360
360
361
361
L'interfaccia `postMessage` consente a due finestre, qualsiasi sia la loro origine, di comunicare:
@@ -367,6 +367,6 @@ L'interfaccia `postMessage` consente a due finestre, qualsiasi sia la loro origi
367
367
-`source`: il riferimento alla finestra mittente.
368
368
-`data`: i dati inviati, sono supportati tutti i tipi di oggetto, ad eccezione di IE che accetta solamente stringhe.
369
369
370
-
Dobbiamo utilizzare `addEventListener` all'interno delle finestra targer, per impostare il gestore dell'evento.
370
+
Dobbiamo utilizzare `addEventListener` all'interno delle finestra target, per impostare il gestore dell'evento.
0 commit comments