mozilla

Compare Revisions

Safely accessing content DOM from chrome

Change Revisions

Revision 98883:

Revision 98883 by Jesse on

Revision 98884:

Revision 98884 by Jesse on

Title:
Safely accessing content DOM from chrome
Safely accessing content DOM from chrome
Slug:
Safely_accessing_content_DOM_from_chrome
Safely_accessing_content_DOM_from_chrome
Tags:
DOM, Extensions, Add-ons, Security, XPCNativeWrapper
DOM, Extensions, Add-ons, Security, XPCNativeWrapper
Content:

Revision 98883
Revision 98884
nn62    <h3 name="Direct_access">
63      Direct access
64    </h3>
n63      1. Direct access is the easier method. Direct access is insn66      Scripts designed to run only in Firefox 1.0.3 and later 1.0
>ecure in Firefox 1.0.2, but that version of Firefox has secure ho> versions or that use <code>xpcnativewrappers=yes</code> in Firef
>les of its own. It is secure in Firefox 1.0.3 as long as the obje>ox 1.1 or later may simply call:
>ct is guaranteed to have the property or method that is accessed  
>through its IDL declaration. For example, foo.nodeType is secure  
>as long as you are sure foo is a Node, and foo.getSelection() is  
>secure as long as you are sure foo is a (...). In Firefox 1.1, di 
>rect access is always secure as long as your extension uses the n 
>ew <code>xpcnativewrappers=yes</code> flag in <a href="en/Chrome_ 
>Registration">its manifest</a> because the use of <a href="#About 
>_XPCNativeWrapper">XPCNativeWrapper</a> is implicit. 
67    </p>
68    <pre>
69return contentWindow.document.documentElement == contentWindow.ge
 >tSelection();
70</pre>
71    <p>
72      Scripts that are designed to run in <i>both</i> Firefox 1.0
 >.2 and earlier and Firefox 1.0.3 and later must use the <code>XPC
 >NativeWrapper</code> version of the script.
n66      2. Explicit use of <a href="#About_XPCNativeWrapper">XPCNatn75      Direct access is insecure in Firefox 1.0.2, but that versio
>iveWrapper</a>. Use of XPCNativeWrapper is secure in all versions>n of Firefox has secure holes of its own. It is secure in Firefox
>, but you have to be careful to wrap every DOM object.> 1.0.3 as long as the object is guaranteed to have the property o
 >r method that is accessed through its IDL declaration. For exampl
 >e, foo.nodeType is secure as long as you are sure foo is a Node, 
 >and foo.getSelection() is secure as long as you are sure foo is a
 > (...). In Firefox 1.1, direct access is always secure as long as
 > your extension uses the new <code>xpcnativewrappers=yes</code> f
 >lag in <a href="en/Chrome_Registration">its manifest</a> because 
 >the use of <a href="#About_XPCNativeWrapper">XPCNativeWrapper</a>
 > is implicit.
n69      What breaks when you use XPCNativeWrapper (explicitly in ann78      <br>
>y version, or with xpcnativewrappers=yes in Firefox 1.1)? 
n71    <h3 name="Do_not_use_the___proto___trick">n80    <h3 name="Explicit_use_of_XPCNativeWrapper">
72      Do not use the <code>__proto__</code> trick81      Explicit use of <a href="#About_XPCNativeWrapper">XPCNative
 >Wrapper</a>
n74    <p>n
75      Some developers have, in the past, used an ill-advised tric
>k to avoid the name collisions mentioned here. This trick took th 
>e following form: 
76    </p>
n78selection = focusedWindow.__proto__.getSelection.call(focusedWindn84var winWrapper = new XPCNativeWrapper(contentWindow,
>ow); 
85                                      'document', 'getSelection()
 >');
86var docWrapper = new XPCNativeWrapper(winWrapper.document, 'title
 >');
87return docWrapper.title == winWrapper.getSelection();
n81      Tricks of this form are insecure in Firefox 1.0.2 and belown90      Note that this example uses <em>two</em> wrappers to get wi
>, prevent the code from working in Firefox 1.0.3 and above on the>ndow.document.title, one wrapper for getting the document propert
> 1.0.x branch, and are again insecure in Firefox 1.1. If you have>y from the window, and one wrapper for getting the title property
> used this trick, you must revise your code to use <code>XPCNativ> from the document.
>eWrapper</code> instead. 
91    </p>
92    <p>
93      Use of XPCNativeWrapper is secure in all versions of Firefo
 >x, but it makes code harder to read and you have to be careful to
 > wrap every DOM object.
94    </p>
95    <p>
96      <br>
n92    <h3 name="Examples">n107    <p>
93      Examples108      What breaks when you use XPCNativeWrapper (explicitly in an
 >y version, or with xpcnativewrappers=yes in Firefox 1.1)?
109    </p>
110    <p>
111      <br>
112    </p>
113    <h3 name="Examples_of_what_NOT_to_do">
114      Examples of what NOT to do
n95    <h4 name="What_NOT_to_do">n
96      What NOT to do
97    </h4>
n99      BAD in older versions, since script can override <code>noden117      BAD in Firefox 1.0.2 and below, since script can override <
>Type</code> getter:>code>nodeType</code> getter:
n105      BAD in older versions, since script can override <code>getSn123      BAD in Firefox 1.0.2 and below, since script can override <
>election</code>:>code>getSelection</code>:
n117      BAD in older versions, since script can override inner gettn135      BAD in Firefox 1.0.2 and below, since script can override i
>er even though outer one is safe:>nner getter even though outer one is safe:
t131    <h4 name="What_TO_do">t
132      What TO do
133    </h4>
134    <p>
135      GOOD (gets the real, native getters):
136    </p>
137    <pre>
138var winWrapper = new XPCNativeWrapper(contentWindow,
139                                      'document', 'getSelection()
>'); 
140var docWrapper = new XPCNativeWrapper(winWrapper.document, 'title
>'); 
141return docWrapper.title == winWrapper.getSelection();
142</pre>
143    <p>
144      Note that this example uses <em>two</em> wrappers to get wi
>ndow.document.title, one wrapper for getting the document propert 
>y from the window, and one wrapper for getting the title property 
> from the document. 
145    </p>
146    <p>
147      The above applies only to scripts for Firefox 1.0.2 and ear
>lier. Scripts designed to run only in Firefox 1.0.3 and later 1.0 
> versions or that use <code>xpcnativewrappers=yes</code> in Firef 
>ox 1.1 or later may simply call: 
148    </p>
149    <pre>
150return contentWindow.document.documentElement == contentWindow.ge
>tSelection(); 
151</pre>
152    <p>
153      Scripts that are designed to run in <i>both</i> Firefox 1.0
>.2 and earlier and Firefox 1.0.3 and later must use the <code>XPC 
>NativeWrapper</code> version of the script. 
154    </p>

Back to History