面向网页开发者版 — 最后更新于 2024 年 9 月 12 日
iframe
元素所有当前引擎都支持。
src
— 资源地址srcdoc
— 在 iframe
中渲染的文档name
— 内容可导航 的名称sandbox
— 嵌套内容的安全规则allow
— 权限策略 应用于 iframe
的内容allowfullscreen
— 是否允许 iframe
的内容使用 requestFullscreen()
width
— 水平尺寸height
— 垂直尺寸referrerpolicy
— 推荐来源策略 用于元素发起的 获取loading
— 用于确定加载延迟HTMLIFrameElement
。src
属性给出元素的 内容可导航 要包含的页面的 URL。如果存在该属性,则必须为一个 有效的非空 URL,可能包含在空格之间。如果在 iframe
元素上指定了 itemprop
属性,则也必须指定 src
属性。
所有当前引擎都支持。
srcdoc
属性给出元素的 内容可导航 要包含的页面的内容。属性的值用于 构建 一个 iframe
srcdoc
文档,它是一个 Document
,其 URL 匹配 about:srcdoc
。
如果存在 srcdoc
属性,则其值必须使用 HTML 语法,该语法包含以下语法组件,按给定顺序排列
上述要求也适用于 XML 文档。
这里一个博客在 srcdoc
属性与下面描述的 sandbox
属性结合使用,为支持此功能的用户代理的用户提供一个额外的层级来防止博客文章评论中的脚本注入
< article >
< h1 > I got my own magazine!</ h1 >
< p > After much effort, I've finally found a publisher, and so now I
have my own magazine! Isn't that awesome?! The first issue will come
out in September, and we have articles about getting food, and about
getting in boxes, it's going to be great!</ p >
< footer >
< p > Written by < a href = "/users/cap" > cap</ a > , 1 hour ago.
</ footer >
< article >
< footer > Thirteen minutes ago, < a href = "/users/ch" > ch</ a > wrote: </ footer >
< iframe sandbox srcdoc = "<p>did you get a cover picture yet?" ></ iframe >
</ article >
< article >
< footer > Nine minutes ago, < a href = "/users/cap" > cap</ a > wrote: </ footer >
< iframe sandbox srcdoc = "<p>Yeah, you can see it <a href="/gallery?mode=cover&amp;page=1">in my gallery</a>." ></ iframe >
</ article >
< article >
< footer > Five minutes ago, < a href = "/users/ch" > ch</ a > wrote: </ footer >
< iframe sandbox srcdoc = "<p>hey that's earl's table.
<p>you should get earl&amp;me on the next cover." ></ iframe >
</ article >
请注意引号需要转义的方式(否则 srcdoc
属性将过早结束),以及在沙盒内容中提到的原始&符号(例如在 URL 或散文中)需要双重转义的方式 - 一次为了在最初解析 srcdoc
属性时保留&符号,第二次为了防止&符号在解析沙盒内容时被误解。
此外,请注意,由于 DOCTYPE 在 iframe
srcdoc
文档 中是可选的,并且 html
、head
和 body
元素具有 可选的开始和结束标签,并且 title
元素在 iframe
srcdoc
文档 中也是可选的,因此 srcdoc
属性中的标记可以相对简洁,尽管它代表整个文档,因为只有 body
元素的内容需要在语法中直接出现。其他元素仍然存在,但只是隐含存在。
在 HTML 语法 中,作者只需要记住使用 U+0022 引号字符(")来包装属性内容,然后转义所有 U+0026 和号(&)和 U+0022 引号字符("),并指定 sandbox
属性,以确保安全地嵌入内容。(还要记住在引号之前转义和号,以确保引号变为 " 而不是 &quot;。)
在 XML 中,U+003C 小于号字符(<)也需要转义。为了防止 属性值规范化,XML 的一些空格字符 - 特别是 U+0009 制表符 (tab)、U+000A 换行符 (LF) 和 U+000D 回车符 (CR) - 也需要转义。[XML]
如果同时指定了 src
属性和 srcdoc
属性,则 srcdoc
属性优先。这允许作者为不支持 srcdoc
属性的传统用户代理提供一个备用 URL。
如果在创建元素时,未设置 srcdoc
属性,并且 src
属性也未设置或已设置但其值无法 解析,则元素的 内容可导航 将保留在 初始 about:blank
Document
中。
如果用户 导航 离开此页面,则 iframe
的 内容可导航 的 活动 WindowProxy
对象将代理新的 Window
对象以用于新的 Document
对象,但 src
属性不会更改。
如果存在 name
属性,则必须为一个 有效的可导航目标名称。如果存在,则在 创建 时,给定值用于命名元素的 内容可导航。
所有当前引擎都支持。
当指定 sandbox
属性时,它会对 iframe
承载的任何内容启用一组额外的限制。它的值必须是一个 无序的、由空格分隔的唯一标记集,这些标记是 ASCII 不区分大小写 的。允许的值是
allow-downloads
allow-forms
allow-modals
allow-orientation-lock
allow-pointer-lock
allow-popups
allow-popups-to-escape-sandbox
allow-presentation
allow-same-origin
allow-scripts
allow-top-navigation
allow-top-navigation-by-user-activation
allow-top-navigation-to-custom-protocols
当设置该属性时,内容被视为来自一个唯一的 不透明来源,表单、脚本和各种潜在的烦人 API 被禁用,链接被阻止指向其他 可导航对象。allow-same-origin
关键字使内容被视为来自其真实来源,而不是将其强制到 不透明来源;allow-top-navigation
关键字允许内容 导航 其 可遍历可导航对象;allow-top-navigation-by-user-activation
关键字的行为类似,但只允许在浏览上下文 活动窗口 具有 短暂激活 时进行这种 导航;allow-top-navigation-to-custom-protocols
重新启用对非 获取方案 的导航,使其 传递给外部软件;allow-forms
、allow-modals
、allow-orientation-lock
、allow-pointer-lock
、allow-popups
、allow-presentation
、allow-scripts
和 allow-popups-to-escape-sandbox
关键字分别重新启用表单、模态对话框、屏幕方向锁定、指针锁定 API、弹出窗口、演示 API、脚本和创建非沙箱 辅助浏览上下文。allow-downloads
关键字允许内容执行下载。 [POINTERLOCK] [SCREENORIENTATION] [PRESENTATION]
allow-top-navigation
和 allow-top-navigation-by-user-activation
关键字不能同时指定,因为这样做是多余的;在这种不符合规范的标记中,只有 allow-top-navigation
会起作用。
类似地,如果指定了 allow-top-navigation
或 allow-popups
,则不能指定 allow-top-navigation-to-custom-protocols
关键字,因为这样做是多余的。
要允许沙箱内容内的 alert()
、confirm()
和 prompt()
,需要同时指定 allow-modals
和 allow-same-origin
关键字,并且加载的 URL 需要与 顶级来源 同源。如果没有 allow-same-origin
关键字,内容始终被视为跨源,跨源内容 无法显示简单的对话框。
当嵌入页面与包含 iframe
的页面 同源 时,一起设置 allow-scripts
和 allow-same-origin
关键字,允许嵌入页面简单地删除 sandbox
属性,然后重新加载自身,从而完全脱离沙箱。
这些标志只有在 iframe
元素的 内容可导航对象 被 导航 时才会生效。移除它们,或者移除整个 sandbox
属性,对已经加载的页面没有影响。
潜在的恶意文件不应与包含 iframe
元素的文件位于同一服务器。如果攻击者可以诱使用户直接访问恶意内容,而不是在 iframe
中访问,那么对恶意内容进行沙箱处理的作用很小。为了限制恶意 HTML 内容可能造成的损害,应该从一个单独的专用域提供服务。使用不同的域可以确保文件中的脚本无法攻击网站,即使用户被欺骗直接访问这些页面,也无法获得 sandbox
属性的保护。
在这个例子中,一些完全未知的、可能是恶意的、用户提供的 HTML 内容被嵌入到一个页面中。因为它来自一个单独的域,所以它受到所有正常的跨站点限制的影响。此外,嵌入的页面禁用了脚本、禁用了插件、禁用了表单,并且它不能导航任何帧或窗口,除了它自己(或它自己嵌入的任何帧或窗口)。
< p > We're not scared of you! Here is your content, unedited:</ p >
< iframe sandbox src = "https://usercontent.example.net/getusercontent.cgi?id=12193" ></ iframe >
使用一个单独的域非常重要,这样即使攻击者诱使用户直接访问该页面,该页面也不会在网站来源的上下文中运行,这会使用户容易受到页面中任何攻击的威胁。
在这个例子中,嵌入了一个来自另一个网站的小部件。该小部件启用了脚本和表单,并且来源沙箱限制被解除,允许该小部件与其源服务器通信。然而,沙箱仍然有用,因为它禁用了插件和弹出窗口,从而降低了用户暴露于恶意软件和其他烦人的东西的风险。
< iframe sandbox = "allow-same-origin allow-forms allow-scripts"
src = "https://maps.example.com/embedded.html" ></ iframe >
假设文件 A 包含以下片段
< iframe sandbox = "allow-same-origin allow-forms" src = B ></ iframe >
假设文件 B 也包含一个 iframe
< iframe sandbox = "allow-scripts" src = C ></ iframe >
此外,假设文件 C 包含一个链接
< a href = D > Link</ a >
对于这个例子,假设所有文件都被当作 text/html
提供服务。
在这个场景中,页面 C 设置了所有沙箱标志。脚本被禁用,因为 A 中的 iframe
禁用了脚本,这覆盖了 B 中的 iframe
上设置的 allow-scripts
关键字。表单也被禁用,因为内部 iframe
(在 B 中)没有设置 allow-forms
关键字。
现在假设 A 中的脚本删除了 A 和 B 中的所有 sandbox
属性。这将立即改变任何东西。如果用户点击了 C 中的链接,将页面 D 加载到 B 中的 iframe
中,页面 D 现在将表现得好像 B 中的 iframe
设置了 allow-same-origin
和 allow-forms
关键字,因为这是在加载页面 B 时 A 中的 iframe
中的 内容可导航对象 的状态。
一般来说,动态删除或更改 sandbox
属性是不可取的,因为它可能使人们难以判断什么被允许,什么不被允许。
当指定 allow
属性时,它会确定在 iframe
的 内容可导航对象 中的 Document
的 权限策略 初始化时要使用的 容器策略。它的值必须是 序列化权限策略。 [PERMISSIONSPOLICY]
在这个例子中,一个 iframe
用于嵌入来自在线导航服务的 地图。
属性用于在嵌套上下文中启用 Geolocation API。allow
< iframe src = "https://maps.example.com/" allow = "geolocation" ></ iframe >
allowfullscreen
属性是一个 布尔属性。当指定时,它表示 iframe
元素的 内容可导航对象 中的 Document
对象将使用一个 权限策略 初始化,该策略允许从任何 来源 使用 "fullscreen
" 功能。这是由 处理权限策略属性 算法执行的。 [PERMISSIONSPOLICY]
这里,一个 iframe
用于嵌入来自视频网站的播放器。
属性是让播放器能够全屏显示视频所必需的。allowfullscreen
< article >
< header >
< p >< img src = "/usericons/1627591962735" > < b > Fred Flintstone</ b ></ p >
< p >< a href = "/posts/3095182851" rel = bookmark > 12:44</ a > — < a href = "#acl-3095182851" > Private Post</ a ></ p >
</ header >
< p > Check out my new ride!</ p >
< iframe src = "https://video.example.com/embed?id=92469812" allowfullscreen ></ iframe >
</ article >
和 allow
都不能授予对 allowfullscreen
iframe
元素的 内容可导航对象 中的功能的访问权限,如果元素的 节点文档 未被允许使用该功能。
因为它们只影响 内容可导航对象 的 活动文档 的 权限策略,所以
和 allow
属性只有在 allowfullscreen
iframe
的 内容可导航对象 被 导航 时才会生效。添加或删除它们对已经加载的文档没有影响。
iframe
元素支持 尺寸属性,用于嵌入内容具有特定尺寸的情况(例如,广告单元具有明确定义的尺寸)。
iframe
元素永远不会有 回退内容,因为它总是 创建一个新的子可导航对象,无论指定的初始内容是否成功使用。
referrerpolicy
属性是一个 引用者策略属性。它的目的是设置在 处理 iframe
属性 时使用的 引用者策略。 [REFERRERPOLICY]
loading
属性是一个 延迟加载属性。它的目的是指示加载位于视窗范围之外的 iframe
元素的策略。
当 loading
属性的状态更改为 Eager 状态时,用户代理必须执行以下步骤
如果 resumptionSteps 为空,则返回。
调用 resumptionSteps。
元素的后代不代表任何内容。(在不支持 iframe
iframe
元素的旧版用户代理中,内容将被解析为可以充当回退内容的标记。)
HTML 解析器 将 iframe
元素中的标记视为文本。
以下是用 iframe
元素从广告经纪商中包含广告的页面的示例
< iframe src = "https://ads.example.com/?customerid=923513721&format=banner"
width = "468" height = "60" ></ iframe >
embed
元素所有当前引擎都支持。
src
— 资源的地址type
— 嵌入式资源的类型width
— 水平尺寸height
— 垂直尺寸embed
元素提供了一个外部应用程序或交互式内容的集成点。
src
属性给出正在嵌入的资源的 URL。如果存在此属性,则它必须包含一个 有效的非空 URL,可能包含空格。
如果在 embed
元素上指定了 itemprop
属性,则也必须指定 src
属性。
type
属性(如果存在)给出用于选择要实例化的插件的 MIME 类型。该值必须是一个 有效的 MIME 类型字符串。如果 type
属性和 src
属性都存在,则 type
属性必须指定与由 src
属性给出的资源的 显式 Content-Type 元数据 相同的类型。
object
元素所有当前引擎都支持。
data
— 资源的地址type
— 嵌入式资源的类型name
— 内容可导航的 名称form
— 将元素与 form
元素关联width
— 水平尺寸height
— 垂直尺寸HTMLObjectElement
。object
元素可以表示一个外部资源,该资源将根据其类型被视为图像或 子可导航的。
data
属性指定资源的 URL。它必须存在,并且必须包含一个 有效的非空 URL,可能包含空格。
type
属性(如果存在)指定资源的类型。如果存在,该属性必须是一个 有效的 MIME 类型字符串。
name
属性(如果存在)必须是一个 有效的可导航目标名称。如果适用,给定的值用于命名元素的 内容可导航的,并且如果在元素的 内容可导航的 创建 时存在,则使用给定的值。
form
属性用于明确地将 object
元素与其 表单所有者 关联。
在此示例中,一个 HTML 页面使用 object
元素嵌入到另一个页面中。
< figure >
< object data = "clock.html" ></ object >
< figcaption > My HTML Clock</ figcaption >
</ figure >