Embedding third-party or user-generated content in an iframe carries real risk without restriction. The sandbox attribute flips the default posture entirely — locked down by default, with specific capabilities selectively re-enabled only as genuinely needed.
1Bare sandbox: Maximum Restriction By Default
<iframe sandbox src="...">, with no value assigned to the sandbox attribute at all, applies the strictest possible restriction set simultaneously: the embedded content cannot execute JavaScript, cannot submit forms, cannot open popup windows, cannot navigate the top-level browsing context, and is treated as originating from a unique, opaque origin distinct from its actual source — among several other default restrictions.
This 'restrict everything, then selectively permit' posture is the correct default mental model for embedding any content that isn't fully, verifiably trusted — a third-party ad, a preview of user-submitted HTML, an embedded widget from an external service.
2Selectively Re-Enabling Specific Capabilities
Space-separated tokens within the sandbox attribute's value re-enable exactly one specific capability each: allow-scripts permits JavaScript execution, allow-forms permits form submission, allow-popups permits opening new windows, allow-same-origin treats the content as originating from its actual origin rather than an opaque one, and several others exist for narrower needs.
This embodies the security principle of least privilege directly: rather than granting an embedded widget full capabilities and hoping nothing goes wrong, you grant only the specific, minimal set of permissions it genuinely requires to function — and nothing more.
3The Documented, Dangerous Combination To Avoid
A well-known, specifically-flagged anti-pattern: combining allow-scripts and allow-same-origin together for genuinely untrusted content. Individually, each token is comparatively safe — allow-scripts alone permits script execution but keeps the content isolated in a distinct, opaque origin, and allow-same-origin alone permits origin access but blocks any scripts from actually exploiting it.
Together, however, the embedded content gains both the ability to execute arbitrary JavaScript *and* full access to same-origin data and APIs, largely recreating the exact unrestricted capability set the sandbox was meant to prevent in the first place — for content that isn't fully trusted, this specific combination should be avoided.
4Step-by-Step Breakdown
Embedding Untrusted Content Safely. An <iframe> embedding third-party or user-generated content — an ad, a widget, a preview of user-submitted HTML — runs with the same capabilities as any other page by default. The sandbox attribute flips that: restrict everything by default, then selectively re-enable only what's genuinely needed.
sandbox Alone Restricts Nearly Everything. <iframe sandbox src="..."> with no value applies the maximum restriction: the embedded content can't run scripts, submit forms, open popups, access the parent page, or navigate the top-level page — an empty sandbox is the most locked-down state possible.
The Bare sandbox Attribute. What happens when you add sandbox with no value at all to an <iframe>?
- →Nothing changes; sandbox requires a value to have any effect
- →Maximum restriction is applied — scripts, forms, popups, and more are all blocked
- →Only image loading within the iframe is blocked
Specific Tokens Selectively Re-Enable Permissions. Space-separated tokens like allow-scripts, allow-forms, allow-popups selectively re-enable only specific capabilities — sandbox="allow-scripts" permits JavaScript execution while everything else remains restricted, letting you grant exactly what's actually needed and nothing more.
Selective sandbox Permissions. What does sandbox="allow-scripts" do compared to a bare sandbox attribute?
- →It removes all restrictions entirely, equivalent to no sandbox at all
- →It re-enables JavaScript execution specifically, while every other restriction remains in place
- →It only affects whether CSS can be applied
The Dangerous Combination To Avoid. Combining allow-scripts AND allow-same-origin together effectively removes the sandbox's core protection — with both, embedded content can run scripts AND access the parent's origin data, potentially defeating the entire point of sandboxing untrusted content in the first place.
The Dangerous Token Combination. Why is combining allow-scripts and allow-same-origin together specifically flagged as risky for genuinely untrusted content?
- →There's no real risk; it's a commonly recommended combination
- →Together, they let embedded content run scripts AND access same-origin data, largely defeating the sandbox's protective purpose
- →It only causes a performance issue, not a security one
iframe Sandbox Mastered. You now understand how a bare sandbox attribute applies maximum restriction, how specific tokens selectively re-enable exactly the permissions genuinely needed, and why combining allow-scripts with allow-same-origin specifically undermines the entire protection for untrusted content.
Sandbox An Untrusted Iframe. The sandbox attribute restricts what an embedded, untrusted page is allowed to do.
Level Up 🚀
Advanced cheat sheets, SEO tricks, and interview prep for this topic.
Browser Support
Fully supported.
Fully supported.
Fully supported.
Fully supported.
Accessibility (A11y)
1Sandboxed Content Should Still Carry An Accurate title Attribute Regardless Of Its Restricted Capabilities
Restricting an iframe's script/form capabilities doesn't affect the requirement for a meaningful accessible name via title, letting assistive technology users still understand the embed's purpose.
SEO Implications
- 1
Correctly Sandboxed Third-Party Embeds Reduce The Risk Of A Compromised Embed Damaging The Host Page's Reputation
If a third-party widget is later compromised, a correctly restrictive sandbox limits the potential damage it could do to the embedding page, indirectly protecting the host site's own trust and search standing.
Best Practices
Start Every Untrusted Or Third-Party iframe Embed With A Bare sandbox Attribute, Then Add Only Genuinely Needed Tokens
This restrict-first, permit-selectively approach directly embodies least privilege and ensures no unnecessary capability is ever granted by oversight.
Never Combine allow-scripts And allow-same-origin For Content That Isn't Fully, Verifiably Trusted
This specific combination is well-documented to largely undermine the sandbox's core protective value, effectively recreating an unrestricted embedding context.
Frequent Bugs
A third-party widget embedded via iframe stops functioning after adding a sandbox attribute.
Identify the specific capability the widget actually needs (scripts, forms, popups) and add only that corresponding token, rather than removing sandbox entirely.
A security review flags an iframe embedding user-submitted HTML preview content with both allow-scripts and allow-same-origin set.
Remove allow-same-origin if the content isn't fully trusted, since this combination largely defeats the sandbox's protection for genuinely untrusted content.
Real-World Examples
A Correctly Restricted User-Content Preview
A markdown/HTML preview feature rendering user-submitted content in a maximally restricted sandbox.
<iframe sandbox srcdoc="user submitted HTML preview"></iframe>
<!-- No allow-scripts: preview content cannot execute JavaScript at all -->