Porównywanie wersji

Bezpieczny dostęp do składników DOM z poziomu chrome

Wersja 284122:

Sprawdzenie wersji 284122 wykonane przez Flaneur

Wersja 213778:

Sprawdzenie wersji 213778 wykonane przez Flaneur

Tytuł:
Bezpieczny dostęp do składników DOM z poziomu chrome
Bezpieczny dostęp do składników DOM z poziomu chrome
Ciąg znaków:
Bezpieczny_dostęp_do_składników_DOM_z_poziomu_chrome
Bezpieczny_dostęp_do_składników_DOM_z_poziomu_chrome
Etykiety:
DOM, XPCNativeWrapper, Wszystkie_kategorie, Bezpieczeństwo, Rozszerzenia, Dodatki
Treść:

Wersja 284122
Wersja 213778
t7    <h3 id="Wprowadzenie" name="Wprowadzenie">t
8      Wprowadzenie
9    </h3>
10    <p>
11      Podczas tworzenia aplikacji i rozszerzeń, w których kodzie 
>JavaScript używane są interfejsy DOM odwołujące się do treści nie 
>zaufanych (np. pochodzących ze stron internetowych), należy zacho 
>wać ostrożność i sprawdzać, czy pobierane informacje rzeczywiście 
> pochodzą z interfejsu API modelu DOM, czy też ich źródłem są wła 
>sności JavaScript oraz metody pobierania i ustawiania zdefiniowan 
>e w kodzie destrukcyjnej strony. W programach Firefox 1.0.3 i Moz 
>illa 1.7.7 wprowadzono mechanizmy utrudniające przesłanie fałszyw 
>ych danych do aplikacji XUL i rozszerzeń — obecnie, gdy w kodzie  
>JavaScript działającym na poziomie chrome uzyskiwany jest dostęp  
>do własności lub metody DOM danego obiektu, zwracana jest własnoś 
>ć lub metoda DOM, a nie zastępujące je niestandardowe własności l 
>ub metody zdefiniowane na stronie internetowej. W programie <a hr 
>ef="pl/Firefox_1.5">Firefox 1.5</a> zastosowano jeszcze bardziej  
>ogólne rozwiązanie (aktywne w domyślnej konfiguracji): aby uzyska 
>ć niezabezpieczony dostęp do składników DOM z poziomu rozszerzeni 
>a, w jego kodzie należy jawnie wyłączyć blokadę. 
12    </p>
13    <p>
14      Istnieją tylko dwa „poprawne” sposoby uzyskiwania dostępu d
>o składników DOM z kodu chrome: dostęp bezpośredni lub jawne użyc 
>ie obiektu <a href="#Obiekty_XPCNativeWrapper">XPCNativeWrapper</ 
>a>. Powszechnie stosowana metoda polegająca na użyciu własności < 
>code>__proto__</code> nie jest bezpieczna w żadnej z wersji progr 
>amu (patrz poniżej <a href="#Przyk.C5.82ady_NIEPOPRAWNEGO_kodu">P 
>rzykłady NIEPOPRAWNEGO kodu</a>). 
15    </p>
16    <p>
17      W poniższej tabeli podsumowano kwestie bezpieczeństwa związ
>ane z zastosowaniem dwóch „poprawnych” sposobów: 
18    </p>
19    <table border="1">
20      <tbody>
21        <tr>
22          <th></th>
23          <th>
24            Dostęp bezpośredni
25          </th>
26          <th>
27            Jawne użycie obiektu <a href="#Obiekty_XPCNativeWrapp
>er">XPCNativeWrapper</a> 
28          </th>
29        </tr>
30        <tr>
31          <th>
32            Firefox 1.0.2 lub starszy
33          </th>
34          <td>
35            niebezpieczne
36          </td>
37          <td>
38            bezpieczne
39          </td>
40        </tr>
41        <tr>
42          <th>
43            Firefox 1.0.3 lub nowszy (1.0.x)
44          </th>
45          <td>
46            bezpieczne, gdy zagwarantowano istnienie własności
47          </td>
48          <td>
49            bezpieczne
50          </td>
51        </tr>
52        <tr>
53          <th>
54            Firefox 1.5
55          </th>
56          <td>
57            bezpieczne, gdy ustawiono preferencję <code>xpcnative
>wrappers=yes</code> (wartość domyślna) 
58          </td>
59          <td>
60            bezpieczne
61          </td>
62        </tr>
63      </tbody>
64    </table>
65    <h3 id="Dost.C4.99p_bezpo.C5.9Bredni" name="Dost.C4.99p_bezpo
>.C5.9Bredni"> 
66      Dostęp bezpośredni
67    </h3>
68    <p>
69      W skryptach, które zaprojektowano do uruchamiania wyłącznie
> w Firefoksie w wersji 1.0.3 oraz nowszych wersjach z serii 1.0.x 
>, a także w skryptach działających w Firefoksie 1.5 lub nowszym p 
>rzy ustawionej preferencji <code>xpcnativewrappers=yes</code>, wy 
>starczy użyć następującego kodu: 
70    </p>
71    <pre class="eval">
72return contentWindow.document.title == contentWindow.getSelection
>(); 
73</pre>
74    <p>
75      Dostęp bezpośredni w Firefoksie 1.0.3 (oraz nowszych wersja
>ch z serii 1.0.x) jest bezpieczny dopóki, dopóty gwarantowane jes 
>t posiadanie przez obiekt danej własności lub metody, do której d 
>ostęp jest uzyskiwany za pośrednictwem deklaracji IDL obiektu. Na 
> przykład własność <code>foo.nodeType</code> jest bezpieczna, jeż 
>eli jest pewne, że zmienna <code>foo</code> jest obiektem typu <c 
>ode>Node</code>; z kolei metoda <code>foo.getSelection()</code> j 
>est bezpieczna, dopóki jest pewne, że zmienna <code>foo</code> re 
>prezentuje okno (obiekt <code>window</code>). Przestrzeganie tych 
> zasad może nie być łatwe — o ile na przykład obiekt <code>nsIDOM 
>NSHTMLDocument</code> posiada metodę <code>open()</code>, o tyle  
>nie ma jej obiekt <code>nsIDOMXULDocument</code>; użycie metody < 
>code>document.open()</code> w Firefoksie 1.0.3 NIE jest więc bezp 
>ieczne, ponieważ obiekt <code>document</code> może reprezentować  
>dokument XUL. W takich przypadkach należy skorzystać z operatora  
><code>instanceof</code>, aby określić, czy obiekt obsługuje dany  
>interfejs IDL (w omawianym przykładzie jest to interfejs <code>ns 
>IDOMNSHTMLDocument</code>). 
76    </p>
77    <p>
78      W Firefoksie 1.5 dostęp bezpośredni jest zawsze bezpieczny,
> chyba że w <a href="pl/Rejestracja_Chrome">pliku manifestu rozsz 
>erzenia</a> użyto wskaźnika <code>xpcnativewrappers=no</code>. W  
>przypadku braku tego wskaźnika obiekty <a href="#Obiekty_XPCNativ 
>eWrapper">XPCNativeWrapper</a> stosowane są domyślnie. 
79    </p>
80    <h3 id="Jawne_u.C5.BCycie_obiektu_XPCNativeWrapper" name="Jaw
>ne_u.C5.BCycie_obiektu_XPCNativeWrapper"> 
81      Jawne użycie obiektu <a href="#Obiekty_XPCNativeWrapper">XP
>CNativeWrapper</a> 
82    </h3>
83    <pre class="eval">
84var winWrapper = new XPCNativeWrapper(contentWindow,
85                                      'document', 'getSelection()
>'); 
86var docWrapper = new XPCNativeWrapper(winWrapper.document, 'title
>'); 
87return docWrapper.title == winWrapper.getSelection();
88</pre>
89    <p>
90      Należy zwrócić uwagę, że w powyższym przykładzie zastosowan
>o <em>dwa</em> obiekty opakowujące, aby uzyskać dostęp do własnoś 
>ci <code>window.document.title</code> — jeden do uzyskania dostęp 
>u do własności <code>document</code> obiektu <code>window</code>, 
> natomiast drugi do odczytania własności <code>title</code> obiek 
>tu <code>document</code>. 
91    </p>
92    <p>
93      Korzystanie z obiektów XPCNativeWrapper jest bezpieczne we 
>wszystkich wersjach Firefoksa, choć zmniejsza czytelność kodu i w 
>ymaga opakowania każdego obiektu DOM. 
94    </p>
95    <p>
96      Więcej informacji o stosowanej składni można znaleźć w <a c
>lass="external" href="http://kb.mozillazine.org/XPCNativeWrapper" 
>>artykule na temat obiektów <code>XPCNativeWrapper</code> w bazie 
> wiedzy witryny MozillaZine</a>. 
97    </p>
98    <h3 id="Obiekty_XPCNativeWrapper" name="Obiekty_XPCNativeWrap
>per"> 
99      Obiekty XPCNativeWrapper
100    </h3>
101    <p>
102      Obiekty <code><a href="pl/XPCNativeWrapper">XPCNativeWrappe
>r</a></code> służą do opakowywania innych obiektów, tak aby można 
> było do nich uzyskać bezpieczny dostęp z poziomu kodu uprzywilej 
>owanego. 
103    </p>
104    <p>
105      Istnieją dwa sposoby korzystania z obiektów <code>XPCNative
>Wrapper</code>. Starszy sposób polega na jawnym użyciu ich w kodz 
>ie. Sposób nowszy (zastosowanie preferencji <code>xpcnativewrappe 
>rs=yes</code>) jest dostępny w programie <a href="pl/Firefox_1.5" 
>>Firefox 1.5</a> i w nowszych wersjach (a także we wstępnych wyda 
>niach alfa o nazwie Deer Park oraz edycjach beta). 
106    </p>
107    <h3 id="Przyk.C5.82ady_NIEPOPRAWNEGO_kodu" name="Przyk.C5.82a
>dy_NIEPOPRAWNEGO_kodu"> 
108      Przykłady NIEPOPRAWNEGO kodu
109    </h3>
110    <p>
111      NIEPOPRAWNE w Firefoksie 1.0.2 i starszych — skrypt może za
>stąpić metodę pobierania <code>nodeType</code>: 
112    </p>
113    <pre class="eval">
114return targetNode.nodeType == 1;
115</pre>
116    <p>
117      NIEPOPRAWNE w Firefoksie 1.0.2 i starszych — skrypt może za
>stąpić metodę <code>getSelection</code>: 
118    </p>
119    <pre class="eval">
120return contentWindow.getSelection();
121</pre>
122    <p>
123      NIEPOPRAWNE we <em>wszystkich</em> wersjach. Niektórzy prog
>ramiści korzystali kiedyś z tego niepewnego sposobu. W starszych  
>wersjach przeglądarki skrypt może zastąpić metodę <code>getSelect 
>ion</code>, <em>a ponadto</em> sposób ten w ogóle nie działa w pr 
>ogramach Firefox 1.0.3 i Mozilla 1.7.7: 
124    </p>
125    <pre class="eval">
126return contentWindow.__proto__.getSelection.call(contentWindow);
127</pre>
128    <p>
129      NIEPOPRAWNE w Firefoksie 1.0.2 i starszych — skrypt może za
>stąpić wewnętrzną metodę pobierania, nawet jeżeli metoda zewnętrz 
>na jest bezpieczna: 
130    </p>
131    <pre class="eval">
132var winWrapper = new XPCNativeWrapper(contentWindow, 'document');
133// dostęp do obiektu contentWindow.document jest teraz bezpieczny
>, ale odczytywanie własności .title   
134// spoza zwracanego dokumentu wciąż nie jest bezpieczne.
135return winWrapper.document.title;
136</pre>
137    <p>
138      NIEPOPRAWNE w Firefoksie w wersjach starszych niż 1.5 — skr
>ypt może ustawić metodę <code>document.open</code> dla dokumentów 
> innych niż dokumenty HTML, w których nie istnieje metoda DOM <co 
>de>document.open</code>: 
139    </p>
140    <pre class="eval">
141return contentWindow.document.open();
142</pre>
143    <div class="noinclude"></div>{{ languages( { "en": "en/Safely
>_accessing_content_DOM_from_chrome", "fr": "fr/Acc\u00e8s_s\u00e9 
>curis\u00e9_au_contenu_DOM_depuis_le_chrome", "ja": "ja/Safely_ac 
>cessing_content_DOM_from_chrome" } ) }} 

Wróć do historii