diff options
Diffstat (limited to 'files/it/xpcnativewrapper/index.html')
-rw-r--r-- | files/it/xpcnativewrapper/index.html | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/files/it/xpcnativewrapper/index.html b/files/it/xpcnativewrapper/index.html new file mode 100644 index 0000000000..eead351c0b --- /dev/null +++ b/files/it/xpcnativewrapper/index.html @@ -0,0 +1,191 @@ +--- +title: XPCNativeWrapper +slug: XPCNativeWrapper +tags: + - DOM + - Estensioni + - RichiedeRevisioneTecnica + - Sicurezza + - Tutte_le_categorie + - XPCNativeWrapper +translation_of: Mozilla/Tech/Xray_vision +--- +<p> +<code>XPCNativeWrapper</code> è un modo di imballare un oggetto in modo da rendere <a href="it/Accedere_ai_contenuti_del_DOM_dal_chrome_in_sicurezza">sicuro l'accesso tramite un codice privilegiato</a>. Può essere utilizzato in tutte le versioni di Firefox, anche se il comportamento è in qualche modo cambiato a partire da Firefox 1.5 (Gecko 1.8). Guarda <a class="external" href="http://kb.mozillazine.org/XPCNativeWrapper">la voce <code>XPCNativeWrapper</code> su MozillaZine</a>(EN) per il comportamento di <code>XPCNativeWrapper</code> nelle versioni di Firefox precedenti alla 1.5. Questo articolo tratta <code>XPCNativeWrapper</code> solo su Firefox 1.5 o superiori. +</p> +<h3 id="Che_cosa_fa_XPCNativeWrapper" name="Che_cosa_fa_XPCNativeWrapper"> Che cosa fa <code>XPCNativeWrapper</code> </h3> +<p>Un <code>XPCNativeWrapper</code> limita l'accesso alle proprietà e ai metodi dell'oggetto che imballa. Le sole proprietà e metodi accessibili attraverso un <code>XPCNativeWrapper</code> sono quelle definite nell'IDL oppure quelle definite da un livello DOM pari a 0 (anche se alcune proprietà o metodi di livello zero <a href="#Limitazioni_a_XPCNativeWrapper">non funzionano con un <code>XPCNativeWrapper</code></a>). In particolare, le proprietà aggiunte ad un oggetto con un JavaScript non sono esposte ad un <code>XPCNativeWrapper</code> per l'oggetto imballato, e l'accesso e la modifica non sono definibili con <code>__defineGetter__</code> e <code>__defineSetter__</code>. L'intento è quello di permettere un accesso sicuro ai metodi definiti dall'IDL dell'oggetto. +</p> +<h3 id="Tipi_di_XPCNativeWrapper" name="Tipi_di_XPCNativeWrapper"> Tipi di <code>XPCNativeWrapper</code> </h3> +<p>Esistono tre diversi tipi di <code>XPCNativeWrapper</code> in Firefox 1.5. Tutti e tre i tipi imballano un ogetto potenzialmente non sicuro e <a href="#Che_cosa_fa_XPCNativeWrapper">garantiscono un accesso sicuro alle sue proprietà e metodi</a>. +</p><p>Le differenze di comportamento tra i tre tipi di <code>XPCNativeWrapper</code> sono determinate dalle due caratteristiche che un <code>XPCNativeWrapper</code> può avere. Un <code>XPCNativeWrapper</code> può essere <a href="#Esplicito_vs._Implicito"><i>esplicito</i></a> (o, all'opposto, <i>implicito</i>) e può essere <a href="#Profondo_vs._Superficiale"><i>profondo</i></a> (o, al contrario, <i>superficiale</i>). Il tipo di imballaggio è determinato dal <a href="#Creare_un_oggetto_XPCNativeWrapper">modo in cui è stato creato</a>, come segue: +</p> +<table> +<tbody><tr> +<th> Creato da +</th><th> Esplicito/Implicito +</th><th> Profondo/Superficiale +</th></tr> +<tr> +<th> <a href="#Accesso_di_uno_script_protetto_ad_un_oggetto_non_attendibile">Accesso di uno script protetto ad un oggetto non attendibile</a> +</th><td> Implicito +</td><td> Profondo +</td></tr> +<tr> +<th> <a href="#Chiamata_del_costruttore_del_XPCNativeWrapper_con_argomento_testuale">Chiamata del costruttore con argomento testuale</a> +</th><td> Esplicito +</td><td> Superficiale +</td></tr> +<tr> +<th> <a href="#Chiamata_del_costruttore_del_XPCNativeWrapper_senza_argomento_testuale">Chiamata del costruttore senza argomento testuale</a> +</th><td> Esplicito +</td><td> Profondo +</td></tr></tbody></table> +<h4 id="Esplicito_vs._Implicito" name="Esplicito_vs._Implicito"> Esplicito vs. Implicito </h4> +<p>La differenza di comportamento tra un <code>XPCNativeWrapper</code> esplicito ed uno implicito è che l'accesso ad una proprietà tramite un <code>XPCNativeWrapper</code> implicito da parte di uno script non <a href="#Che_cos.27.C3.A8_uno_script_protetto.3F">protetto</a> NON è sicuro. L'accesso alla proprietà sarà trasmesso attraverso il <code>wrappedJSObject</code> del <code>XPCNativeWrapper</code>. +</p><p>Questo significa che gli script non protetti non devono preoccuparsi di eventuali bug perché gli altri codici li tratteranno come un <code>XPCNativeWrapper</code> implicito. Dall'altro lato, tali script hanno bisogno di evitare l'accesso di oggetti non sicuri. +</p><p>L'accesso ad una proprietà attraverso un <code>XPCNativeWrapper</code> esplicito è sicuro indipendentemente dalla circostanza che lo script che effettua la chiamata sia <a href="#Che_cos.27.C3.A8_uno_script_protetto.3F">protetto</a> o meno. +</p> +<h4 id="Profondo_vs._Superficiale" name="Profondo_vs._Superficiale"> Profondo vs. Superficiale </h4> +<p>La differenza di comportamento tra un <code>XPCNativeWrapper</code> profondo ed uno superficiale risiede nel fatto che quando si effettua l'accesso ad una proprietà o quando una funzione viene richiamata in un imballaggio profondo, il valore restituito sarà imballata in un suo proprio <code>XPCNativeWrapper</code>. Il nuovo <code>XPCNativeWrapper</code> sarà profondo e sarà anche <a href="#Esplicito_vs._Implicito">esplicito</a> se e solo se il <code>XPCNativeWrapper</code> al quale appartiene la proprietà alla quale si è effettuato l'accesso sia anch'esso esplicito. Al contrario, quando una si accede ad una proprietà o ad una funzione mediante un imballaggio superficiale, il valore restituito potrebbe essere un oggetto non sicuro. +</p><p>Ad esempio, poniamo di avere tre istanze di <code>XPCNativeWrapper</code> per lo stesso oggetto <code>window</code>. Chiamiamole <code>deepExplicitWindow</code>, <code>deepImplicitWindow</code> e <code>shallowWindow</code>. Avremo quindi: +</p> +<pre class="eval">var doc1 = deepExplicitWindow.document; +// doc1 è ora un <code>XPCNativeWrapper</code> profondo ed esplicito +// per l'oggetto del documento. Accedere a doc1.open() è sicuro. +</pre> +<pre class="eval">var doc2 = deepImplicitWindow.document; +// Se lo script di chiamata ha impostato xpcnativewrappers=yes, doc2 è un +// <code>XPCNativeWrapper</code> profondo ed implicito per l'oggetto documento. +// Altrimenti doc2 è un oggetto documento non sicuro, datoché l'accesso +// alle proprietà è passato semplicemente all'oggetto non sicuro. +</pre> +<pre class="eval">var doc3 = shallowWindow.document; +// doc3 è un oggetto documento non sicuro. +</pre> +<h3 id="Creare_un_oggetto_XPCNativeWrapper" name="Creare_un_oggetto_XPCNativeWrapper"> Creare un oggetto <code>XPCNativeWrapper</code> </h3> +<p>Ci sono tre modi diversi per creare un oggetto <code>XPCNativeWrapper</code>; un modo per ognuno dei tre tipi. +</p> +<h4 id="Accesso_di_uno_script_protetto_ad_un_oggetto_non_attendibile" name="Accesso_di_uno_script_protetto_ad_un_oggetto_non_attendibile"> Accesso di uno script protetto ad un oggetto non attendibile </h4> +<p>Ogni volta che uno <a href="#Che_cos.27.C3.A8_uno_script_protetto.3F">script protetto</a> accede ad un <a href="#Che_cos.27.C3.A8_un_oggetto_non_attendibile.3F">oggetto non attendibile</a> otterrà un <code>XPCNativeWrapper</code> <a href="#Esplicito_vs._Implicito">implicito</a> e <a href="#Profondo_vs._Superficiale">profondo</a> . L'accesso alle proprietà di questo <code>XPCNativeWrapper</code> da parte di uno script protetto è sicuro. +</p><p>Un imballaggio creato in tal modo esisterà a lungo quanto l'oggetto imballato, e un doppio accesso all'oggetto restituirà lo stesso <code>XPCNativeWrapper</code>. +</p> +<h5 id="Che_cos.27.C3.A8_uno_script_protetto.3F" name="Che_cos.27.C3.A8_uno_script_protetto.3F"> Che cos'è uno script protetto? </h5> +<p>Uno script si considera protetto o non protetto a seconda del suo URI. Uno script si considera protetto solamente se il suo URI inizia con un prefisso protetto conosciuto. I prefissi protetti in Firefox 1.5 sono determinati dal Registro Chrome. +</p><p>Come opzione predefinita, <b>tutti i pacchetti di contenuti sono protetti</b>. Questo significa che tutti gli URI che iniziano con "<tt><a class=" external" rel="freelink">chrome://</a><package name>/content/</tt>" (per ogni pacchetto) sono protetti. I singoli pacchetti possono <a href="it/Registrazione_Chrome#xpcnativewrappers">sovrascrivere questa regola utilizzando un contrassegno</a> nel file chrome manifest. +</p> +<h5 id="Che_cos.27.C3.A8_un_oggetto_non_attendibile.3F" name="Che_cos.27.C3.A8_un_oggetto_non_attendibile.3F"> Che cos'è un oggetto non attendibile? </h5> +<p>Tutti gli oggetti possono essere sia sicuri che non sicuri. Un oggetto è attendibile se una qualsiasi delle seguenti affermazioni è soddisfatta: +</p> +<ol><li> Il suo oggetto genitore è attendibile (la proprietà <code>__parent__</code> in JavaScript). +</li><li> E' un oggeto che definisce il raggio d'azione di un componente JavaScript. +</li><li> E' l'oggetto <code>window</code> per una <a href="#Che_cos.27.C3.A8_una_finestra_attendibile.3F">finestra attendibile</a>. +</li></ol> +<p>Poiché tutti gli oggetti DOM in una finestra hanno l'oggetto <code>window</code> come <code>__parent__</code> nella loro catena d'oggetti, sranno attendibili se e solo se anche la loro finestra risulta attendibile. +</p> +<h5 id="Che_cos.27.C3.A8_una_finestra_attendibile.3F" name="Che_cos.27.C3.A8_una_finestra_attendibile.3F"> Che cos'è una finestra attendibile? </h5> +<p>Se una finestra sia sicura o meno dipende dal suo contenitore. Una finestra è attendibile se soddisfa una delle seguenti condizioni: +</p> +<ol><li> E' una finestra di livello principale (es. <code><xul:window></code>, <code><xul:dialog></code>, o un qualche URI passato in linea di comando con l'indicatore <tt>-chrome</tt>). +</li><li> L'elemento genitore è attendibile e soddisfa una di queste tre opzioni: +<ol><li> Non viene caricato in un <code><xul:iframe></code> o <code><xul:browser></code>. +</li><li> E' caricato in un <code><xul:iframe></code> o <code><xul:browser></code> senza l'attributo "tipo". +</li><li> E' caricato in un <code><xul:iframe></code> o <code><xul:browser></code> e il valore dell'attributo "tipo" non è "content" e non inizia con "content-". +</li></ol> +</li></ol> +<p>Nota che la circostanza che una finestra sia sicura non dipende dall'URI caricato nella finestra. Quindi, ad esempio, le seguenti stringhe creerebbero finestre attendibili qualora utilizzate in documenti le cui finestre siano già sicure: +</p> +<ul><li> <code><xul:browser></code> +</li><li> <code><xul:browser type="chrome"></code> +</li><li> <code><xul:browser type="rabid_dog"></code> +</li><li> <code><xul:iframe type="foofy"></code> +</li><li> <code><html:iframe></code> +</li><li> <code><html:iframe type="content"></code> +</li></ul> +<p>I seguenti valori invece non creerebbero finestre attendibili: +</p> +<ul><li> <code><xul:browser type="content"></code> +</li><li> <code><xul:iframe type="content-primary"></code> +</li></ul> +<p>N.B. qualsiasi finestra discendente di una finestra non attendibile è automaticamente un elemento non sicuro. +</p> +<h5 id="Cosa_accade_quando_uno_script_accede_ad_un_oggetto.3F" name="Cosa_accade_quando_uno_script_accede_ad_un_oggetto.3F"> Cosa accade quando uno script accede ad un oggetto? </h5> +<p>La tabella riportata sotto descrive cosa accade quando uno script accede ad un oggetto, e come viene coinvolto il "wrapper". +</p> +<table> +<tbody><tr> +<th> Script +</th><th> Oggetto +</th><th> Effetti +</th></tr> +<tr> +<td> Protetto </td><td> Attendibile </td><td> Non viene creato nessun imballaggio, e dunque lo script ha un pieno accesso all'oggetto. +</td></tr> +<tr> +<td> Protetto </td><td> Non attendibile </td><td> Viene creato un <code>XPCNativeWrapper</code> <a href="#Esplicito_vs._Implicito">implicito</a> e <a href="#Profondo_vs._Superficiale">profondo</a>. +</td></tr> +<tr> +<td> Non protetto </td><td> Attendibile </td><td> Non viene creato nessun imballaggio, come nel caso protetto/attendibile. +</td></tr> +<tr> +<td> Non protetto </td><td> Non attendibile </td><td> Non viene creato nessun imballaggio, come nel caso protetto/attendibile. +</td></tr></tbody></table> +<h4 id="Chiamata_del_costruttore_del_XPCNativeWrapper_con_un_argomento_testuale" name="Chiamata_del_costruttore_del_XPCNativeWrapper_con_un_argomento_testuale"> Chiamata del costruttore del <code>XPCNativeWrapper</code> con un argomento testuale </h4> +<p>Ad esempio: +</p> +<pre class="eval">var contentWinWrapper = new XPCNativeWrapper(content, + "document"); +</pre> +<p>Questo crea un <code>XPCNativeWrapper</code> esplicito e superficiale. Questa sintassi è stata mantenta per la retrocompatibilità. Mentre l'accesso a tutte le proprietà del oggetto <code>contentWinWrapper</code> è ora sicuro, l'accesso al valore restituito da queste proprietà NON è sicuro (proprio come nelle versioni precedenti a Firefox 1.5), dal momento che il <code>XPCNativeWrapper</code> è superficiale. Quindi per confrontare il titolo del contenuto del documento con la selezione corrente del contenuto, occorre fare: +</p> +<pre class="eval">var winWrapper = new XPCNativeWrapper(content, "document", + "getSelection()"); +var docWrapper = new XPCNativeWrapper(winWrapper.document, + "title"); +return docWrapper.title == winWrapper.getSelection(); +</pre> +<p>proprio come nelle versioni di Firefox precedenti alla 1.5. Nota che l'argomento <code>"getSelection()"</code> non è strettamente necessario in questo caso; se non si intende utilizzare tale codice con versioni precedenti a Firefox 1.5, può essere rimosso. Un singolo argomento testuale dopo l'imballaggio dell'oggetto è quanto è necessario a Firefox per creare questo tipo di <code>XPCNativeWrapper</code>. +</p> +<h4 id="Chiamata_del_costruttore_del_XPCNativeWrapper_senza_un_argomento_testuale" name="Chiamata_del_costruttore_del_XPCNativeWrapper_senza_un_argomento_testuale"> Chiamata del costruttore del <code>XPCNativeWrapper</code> senza un argomento testuale </h4> +<p>Ad esempio: +</p> +<pre class="eval">var contentWinWrapper = new XPCNativeWrapper(content); +</pre> +<p>Questo crea un <code>XPCNativeWrapper</code> esplicito e profondo. L'accesso alle proprietà di questo <code>XPCNativeWrapper</code> è sicuro, ed anche i valori restituiti saranno imballati in un oggetto <code>XPCNativeWrapper</code> profondo ed esplicito. +</p> +<h3 id="Impostare_le_propriet.C3.A0_.22expando.22_in_un_XPCNativeWrapper" name="Impostare_le_propriet.C3.A0_.22expando.22_in_un_XPCNativeWrapper"> Impostare le proprietà "expando" in un <code>XPCNativeWrapper</code> </h3> +<p>E' possibile impostare le proprietà "expando" (che sono proprietà con nomi non corrispondenti a quelli delle proprietà definite dall'IDL) in un oggetto <code>XPCNativeWrapper</code>. Se ciò viene fatto, il chrome sarà in grado di vedere queste proprietà "expando", ma il contenuto no. <b>Non esiste un modo sicuro per impostare una proprietà "expando" dal chrome e fare in modo che sia poi leggibile dal contenuto.</b> +</p> +<h3 id="Durata_della_vita_di_un_XPCNativeWrapper" name="Durata_della_vita_di_un_XPCNativeWrapper"> Durata della vita di un <code>XPCNativeWrapper</code> </h3> +<p>Gli oggetti <code>XPCNativeWrapper</code> espliciti esistono finché vi viene fatto rifierimento. Creare un nuovo <code>XPCNativeWrapper</code> esplicito per lo stesso oggetto potenzialmente non sicuro, genera un nuovo imballaggio; una cosa da evitare quando si <a href="#Impostare_le_propriet.C3.A0_.22expando.22_in_un_XPCNativeWrapper">impostano le proprietà "expando"</a> +</p><p>Gli oggetti <code>XPCNativeWrapper</code> impliciti hanno la stessa durata degli oggetti che imballano. +</p> +<h3 id="Accedere_a_propriet.C3.A0_non_sicure" name="Accedere_a_propriet.C3.A0_non_sicure"> Accedere a proprietà non sicure </h3> +<p>Se per qualche ragione è necessario accedere ad una proprietà non sicura, questo può essere effettuato attraverso la proprietà <code>wrappedJSObject</code> dell'imballaggio. Ad esempio, se <code>docWrapper</code> è l'imballaggio di <code>doc</code>, allora +</p> +<pre class="eval">docWrapper.wrappedJSObject.prop +</pre> +<p>è uguale a </p> +<pre class="eval">doc.prop +</pre> +<h3 id="Limitazioni_a_XPCNativeWrapper" name="Limitazioni_a_XPCNativeWrapper"> Limitazioni a <code>XPCNativeWrapper</code> </h3> +<p>Ci sono alcune proprietà comuni e stili di programmazione che non possono essere utilizzati con un <code>XPCNativeWrapper</code>. In particolare: +</p> +<ol><li> L'assegnazione o la lettura di una proprietà <code>on*</code> su un <code>XPCNativeWrapper</code> di un nodo DOM o di un oggetto <code>Window</code> genererà un eccezione. (Occorre usare invece <code>addEventListener</code>, e utilizzare "event.preventDefault();" nel programma di gestione se si è già utilizzato "return false;" prima.) +</li><li> L'accesso ai frame tramite il nome della finestra (es. <code>window.frameName</code>) non funziona con un <code>XPCNativeWrapper</code> +</li><li> <code>document.all</code> non funziona in un <code>XPCNativeWrapper</code> per un documento. +</li><li> L'accesso ad oggetti con un id (nome) tramite l'id non funziona con un <code>XPCNativeWrapper</code> per un documento HTML. Per esempio, se si ha <code><form name="foo"></code> e <code>docWrapper</code> è l'imballaggio del documento HTML <code>doc</code> allora <code>doc.foo</code> è un <code>HTMLFormElement</code> mentre <code>docWrapper.foo</code> è <code>undefined</code>. Deve essere utilizzato <code>docWrapper.forms.namedItem("foo")</code>. +</li><li> L'accesso ai nodi attraverso l'id non funziona con un <code>XPCNativeWrapper</code> per un documento HTML. Dovrebbe essere utilizzato <code>getElementById</code>. +</li><li> L'accesso agli input attraverso il nome non funziona con un <code>XPCNativeWrapper</code> per un modulo (form) HTML. Bisogna usare <code>form.elements.namedItem("inputname")</code>. +</li><li> L'accesso ad elementi attraverso il nome non funziona con un <code>XPCNativeWrapper</code> per un <code>HTMLCollection</code>. Occorre usare il metodo <code>namedItem()</code>. Nota che <code>namedItem</code> restituisce solo il primo elemento di input con il nome, anche se vi sono elementi multipli (es. bottoni radio) che abbiano lo stesso nome. +</li><li> I metodi di chiamata implementati dai plug-in NPAPI attraverso il <code>XPCNativeWrapper</code> dei nodi corrispondenti non funzionano. +</li><li> Non è possibile ottenere o impostare proprietà implementate da plug-in NPAPI attraverso il <code>XPCNativeWrapper</code> dei nodi corrispondenti. +</li><li> I metodi di chiamata implementati attraverso XBL binding associati ad un nodo attraverso il <code>XPCNativeWrapper</code> di quel nodo, non funzionano. +</li><li> Non è possibile ottenere o impostare proprietà implementate attraverso XBL binding associati ad un nodo attraverso il <code>XPCNativeWrapper</code> di quel nodo. +</li><li> L'elenco delle proprietà di un <code>XPCNativeWrapper</code> attraverso "<code>for (var p in wrapper)</code>" non cpntiene le proprietà definte dall'IDL. +</li><li> Object.prototype non appartiene alla catena di prototipi di un <code>XPCNativeWrapper</code>. Come risultato, molte proprietà <code>Object.prototype</code> non sono definite in un <code>XPCNativeWrapper</code> (per essere precisi queste sono <code>__proto__</code>, <code>__parent__</code>, <code>__count__</code>, <code>toSource</code>, <code>toLocaleString</code>, <code>valueOf</code>, <code>watch</code>, <code>unwatch</code>, <code>hasOwnProperty</code>, <code>isPrototypeOf</code>, <code>propertyIsEnumerable</code>, <code>__defineGetter__</code>, <code>__defineSetter__</code>, <code>__lookupGetter__</code>, e <code>__lookupSetter__</code>). +</li><li> Non esiste più il supporto per il metodo <code>importXPCNative</code> che le vecchie implementazioni di <code>XPCNativeWrapper</code> erano solite avere. +</li><li> L'accesso a classi standard (come <code>Function</code>) attraverso un <code>XPCNativeWrapper</code> non avrà effetto. Per creare funzioni e oggetti con una particolare finestra genitore, occorre utilizzare la funzione <code>eval</code> di quella finestra. +</li></ol> +<p><a class="external" href="http://oreillynet.com/pub/a/network/2005/11/01/avoid-common-greasemonkey-pitfalls.html?page=3">Evitare insidie comuni in Greasemonkey</a>(EN) contiene una elaborata spiegazione di alcune di queste limitazioni (sebbene nel contesto degli script di Greasemonkey). +</p>{{ languages( { "en": "en/XPCNativeWrapper", "fr": "fr/XPCNativeWrapper" } ) }} |