Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

<iframe> and <object> are both blank, but only in Firefox

I am attempting to embed one site into another site. I control both servers, which I will refer to here as "site1.com" (the site in the browser) and "site2.com" (the site I am trying to embed).

HTML embed code

Attempt 1, using iframe tag:

<iframe height="600" width="600" name="my other site"
        src="https://site2.com/foo/bar">
    Unable to display--your browser does not support frames.
</iframe>

Attempt 2, using object tag:

<object type="text/html" height="600" width="600" name="my other site"
        data="https://site2.com/foo/bar"></object>

Things I know are not the problem

Secure/insecure mismatch

I've read that Firefox will not allow an HTTP embed into an HTTPS page. Both sites are HTTPS, so there is no mismatch. The loaded resources (CSS, etc) are also https, from same origin, so there is no mixed-content problem.

I have tried setting security.mixed_content.block_active_content to false, in case I was mistaken about this, but the iframe was still blank.

Invalid or untrusted certificates

Both sites are using valid certificates, signed by a proper trusted authority, and are not expired. In fact, we are using a subdomain wildcard certificate, so they are both using the same certificate (they both are in the same subdomain).

X-Frame-Options

The site that I am trying to embed has this response header:

X-Frame-Options: ALLOW-FROM SITE1.COM

Content-Security-Policy

The site that I am trying to embed has this response header (wrapped here for readability):

Content-Security-Policy:
    frame-ancestors https://site1.com;
    default-src 'self';
    script-src https://site1.com 'self' 'unsafe-inline';
    style-src https://site1.com 'self' 'unsafe-inline'

Extra disclosure, possibly not needed - these headers are being generated by a Django application server, using this config and the "django-csp" module.

X_FRAME_OPTIONS = 'Allow-From site1.com'

CSP_FRAME_ANCESTORS = ('https://site1.com',)
CSP_STYLE_SRC = ('https://site1.com', "'self'", "'unsafe-inline'")
CSP_SCRIPT_SRC = ('https://site1.com', "'self'", "'unsafe-inline'")

CORS

My understanding is that CORS is only in play when the request contains an "Origin" header. That doesn't seem to be happening here. I have also tried addressing CORS by using this header:

Access-Control-Allow-Origin: https://site1.com

But that appears to have no effect.

Ad blocker

I do not have an ad blocker in this Firefox install. I also removed all of my extensions and re-tested after a Firefox restart, the "blank iframe" behavior remains the same with no extensions installed at all.

Observed behavior

I have tested using the following browsers.

  • Google Chrome 58.0.3029.81 (64-bit) (macOS)
  • Safari 10.1 (macOS)
  • Firefox 53.0 (64-bit) (macOS)
  • Microsoft Edge 38.14393.0.0 (Windows 10)

Using Chrome, Safari, and Edge, the frame is shown like I expect - site2.com appears as a box inside of the site1.com page.

Using Firefox, I am shown an empty space of the size specified (600x600). If I used iframe, then there is a black border around it. If I used object, it's just a blank area with no border.

The most interesting thing is that if I open the developer console and reload the page, I see the requests to fetch site1.com and its CSS and so on, but there are no requests made for site2.com. It isn't that there is a problem showing site2.com, it is never requested at all.

Also, the developer console shows no errors or warnings about this. If there were an error condition or security exception preventing the loading of the second site, I would expect some sort of warning to be logged.

This has been driving me crazy for a few days. Any suggestions appreciated.

like image 506
Dan Lowe Avatar asked Apr 20 '17 21:04

Dan Lowe


People also ask

How do I enable iframe in Firefox?

You can change this behaviour in your own Firefox installation by typing about:config in the address bar and setting security. mixed_content. block_active_content to false .

Is iframe deprecated?

Overview. The widget is considered deprecated. If you need to use an IFrame, consider the "IFrame Component" widget The Iframe can be used to embed websites in the client.

Is iframe still used?

iFrames are an HTML tag and have been around for absolutely ages having been introduced back in 1997. Despite their age, they are still commonly used and are supported by all modern browsers.


2 Answers

I reproduced the issue on my server which serves 2 domains, and then fixed it this way:

X-Frame-Options: ALLOW-FROM https://SITE1.COM

I added https://, as seen in MDN page for X-Frame-Options

You can observe the difference here (only with Firefox of course, as with other browsers both frames are shown): I pushed a php page that inserts the header without or with https://, and created this fiddle that insert 2 iframes: Firefox shows first iframe as empty, and second one with content (which echoes the value in header) on the right.

screenshot of firefox

Since you are forced to put a "serialized origin" (protocol+FQDN), I wondered if you can put multiple entries, or wildcards. My understanding of RFC 7034 says you cannot.

Now about this detail:

The most interesting thing is that if I open the developer console and reload the page, I see the requests to fetch site1.com and its CSS and so on, but there are no requests made for site2.com. It isn't that there is a problem showing site2.com, it is never requested at all.

That's because it was cached. I also saw that, but a force-refresh rightly showed a new request was made.

like image 153
Hugues M. Avatar answered Sep 18 '22 09:09

Hugues M.


If you knew the source code (right click and view source of url to embed - but you control it in this case so you can copy and paste) and it was only a reasonably small amount of code (probable because you're using an iframe), then you could use the HTML5 srcdoc attribute to embed the html code, instead of pointing to the url. This would save a lot of hassle regarding unknown factors regarding the site you want to embed (CORS etc..) which you would not usually know if you didn't have control over the second site.

According to caniuse.com the srcdoc property has full support in Firefox since vsn 25 onwards (so since Sept 2013).

Hope this helps (Here's a tested jsfiddle example)

like image 25
Rachel Gallen Avatar answered Sep 20 '22 09:09

Rachel Gallen