Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to allow all frame ancestors with CSP header?

I have a web app which I want to display in an iframe in web apps with different domains. Since I have added a content-security-policy header my app refuses to display in iframe. I saw that i need to add frame-ancestors options but all the examples I see are using specific domains. How can I allow it for all domains? Is "frame ancestors *;" enough? Thanks!

like image 911
Lyubomir Ruzhinski Avatar asked Sep 21 '20 09:09

Lyubomir Ruzhinski


People also ask

Can I use CSP frame-ancestors?

No, you cannot use the frame-ancestors directive from a Content-Security-Policy meta tag. It must be specified as part of a Content-Security-Policy header.

How do I set Content-Security-Policy frame-ancestors self?

The HTTP Content-Security-Policy (CSP) frame-ancestors directive specifies valid parents that may embed a page using <frame> , <iframe> , <object> , <embed> , or <applet> . Setting this directive to 'none' is similar to X-Frame-Options : deny (which is also supported in older browsers).

Can you have multiple CSP headers?

Combining everything into a single Content-Security-Policy header works just fine, however. In other words, multiple Content-Security-Policy headers do not combine together. The most restrictive header is favored.


1 Answers

Briefly - yes, * allows any sources for iframe except data:.

Pls note that frame-ancestors is not supported in the meta tag <meta http-equiv='Content-Security-Policy' content="..."> (but looks like you use HTTP header to delivery CSP, so this warn not for you).

But if you really wish to allow all frame ancestors - more reliable not specify frame-ancestors directive at all, because for now Mozilla Firefox has some bugs with it.

PS: You did not attach print screen of errors in browser console - may be iframes was block by other reason than CSP?

updated after exposed CSPs details

<html>
  parent page issues CSP: default-src 'self';
  since frame-src omitted, it fallback to default-src and result be: frame-src 'self'

  <iframe src=''></iframe>
</html>

iframe is allowed with the same scheme://host:port as parent page loads. 'self' is tricky in that if parent loaded via HTTP:, iframe via HTTPS: will blocked in CSP2-browsers. CSP3-browsers do upgrade (see para 3) HTTP: to HTTPS:, so all OK.

If parent page issue frame-ancestors * policy, it means you allow to embed it into iframe to any another webpage. X-Frame-Options HTTP header provide the same functionality, but it's overridden if frame-ancestor is issueed.

  • frame-ancestor directive does not affects <iframe> embed into page who published this CSP. It affects where it allowed to embed this page.
  • But <iframe> could publish its own CSP with rule frame-ancestors domain1.com domain2.com to restrict it embedding to other web-pages.

That's how it works. You could play with test of frame-ancestors to clarify details for different <iframe src=/srcdoc=.

Therefore if you embeds iframe from your own domain/subdomains, it's more safe to use:

frame-ancestors 'self';

or if you use subdomains:

frame-ancestors http://example.com https://example.com http://*.example.com https://*.example.com;

like image 180
granty Avatar answered Sep 27 '22 21:09

granty