前言

在平时的开发中,或多或少会用到iframe,大部分时候我们只需要简单的使用iframe标签,设置个宽高即可,很少回去深究iframe的别的特性。比如这种用法:

<iframe src='https://blog.5udou.cn'>

但直到产品经理要求说,iframe嵌入的页面可不可以让主页面的url地址发生变化呀?好吧,一下子懵圈了,我得去查查资料,于是索性就深究深究iframe的一些特性,免得再次尴尬。

下面所有代码都可以在这里找到:https://github.com/linxiaowu66/iframe-demo

iframe的特性

iframe的特性都是依赖参数配置实现的,现整理如下有用的属性:

iframe的allow属性详解

allow属性的使用需要参考特性策略这一小节。特性策略可以允许你控制页面或者iframe可以使用哪些特性。页面控制的话设置在HTTP头部的Feature-Policy的这个字段,iframe的话就是我们要说的这个allow字段。

特性策略的书写规则是:<feature name> <allowlist of origin(s)>

完整的特性名称参考: Policy Controlled Features或者Feature-Policy

而allowlist则有如下规则:

  1. *:表示该特性在该文档下都是允许的,包括所有的嵌套的浏览内容(iframes),而不用管这些内容的源。
  2. self:表示该特性在该文档下都是允许的,并且仅在同源的情况下嵌套的浏览内容(iframes)才可以使用。
  3. src:(iframes的allow属性专用)表示该特性在这个iframe下允许使用,只要加载的文档来源的源和iframe的src属性指定的URL是同源的。
  4. none:表示该特性在顶层以及嵌套的浏览内容下都是被禁用的
  5. <origin(s)>:表示该特性只在一些指定的源下才允许使用,多个源使用空格隔开

今天我们主要讲一下iframe下的allow属性,比如你不允许iframe的页面全屏、不允许调用摄像头之类的行为,可以这么配置:

<iframe allow="camera 'none'; fullscreen 'none'">

比如只允许同源的才可以使用全屏这个特性:

<iframe src="https://example.com..." allow="fullscreen 'src'"></iframe>

比如只允许指定源才可以使用定位功能:

<iframe src="https://google-developers.appspot.com/demos/..." allow="geolocation https://google-developers.appspot.com"></iframe>

iframe的referrerpolicy属性详解

这个属性牵扯到了HTTP的referer策略,我们知道referer的策略是这样的:

  • No Referrer:任何情况下都不发送 Referrer 信息;
  • No Referrer When Downgrade:仅当发生协议降级(如 HTTPS 页面引入 HTTP 资源,从 HTTPS 页面跳到 HTTP 等)时不发送 Referrer 信息。这个规则是现在大部分浏览器默认所采用的;
  • Origin Only:发送只包含 host 部分的 Referrer。启用这个规则,无论是否发生协议降级,无论是本站链接还是站外链接,都会发送 Referrer 信息,但是只包含协议 + host 部分(不包含具体的路径及参数等信息);
  • Origin When Cross-origin:仅在发生跨域访问时发送只包含 host 的 Referrer,同域下还是完整的。它与 Origin Only 的区别是多判断了是否 Cross-origin。需要注意的是协议、域名和端口都一致,才会被浏览器认为是同域;
  • Unsafe URL:无论是否发生协议降级,无论是本站链接还是站外链接,统统都发送 Referrer 信息。正如其名,这是最宽松而最不安全的策略;

比如我们这样配置:

<iframe allow="fullscreen 'none'" referrerpolicy="no-referrer" src='http://127.0.0.1:3000/iframe.html'></iframe>

我们通过抓包可以看到对应的请求是这样的:

iframe的sandbox属性详解

iframe的沙箱模式可以提供一些额外的配置,当你把一个iframe置为沙箱的时候,意味着沙箱内的内容的行为全凭你控制了。

比如你在iframe下这样配置:

<iframe sandbox="" src='http://127.0.0.1:3000/iframe1.html'></iframe>

但是iframe1.html中却有对应的js脚本,那么在控制台下可以看到这样的报错:

Blocked script execution in 'http://127.0.0.1:3000/iframe1.html' because the document's frame is sandboxed and the 'allow-scripts' permission is not set.

所以当你的iframe有脚本的时候,基本上都会配置allow-scripts这个属性。

再比如你的页面会有form标签提交数据的时候,如果没有allow-forms,则会报这种错误:

Blocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.

接下来解释一下各个配置的含义:

关于沙箱模式的注意点

  • 当被嵌入的文档与主页面同源时,强烈建议不要同时使用allow-scriptsallow-same-origin,否则的话将允许嵌入的文档通过代码删除sandbox属性。虽然你可以这么做,但是这样的话其安全性还不如不用sandbox。
  • 如果攻击者可以将潜在的恶意内容往用户的已沙箱化的iframe中显示,那么沙箱操作的安全性将不再可靠。推荐把这种内容放置到独立的专用域中,减小可能的损失。
  • 沙箱属性(sandbox)在Internet Explorer 9及更早的版本上不被支持

经过上面的解释,想必知道刚开始的那个问题的答案了吧?

Tips

  1. window.frames

frames属性是一个类似数组的对象;因为frames实际上是window对象的别名,frames属性又是可以遍历的,所以它是一个类似数组的对象: window.frames.length === window.length;

frames属性的每一项是框架内的窗口,即框架内的window对象;frames属性的每一项并不是iframe的dom节点!!!若需要获取iframe的dom节点可以通过以下方法: frames[0].frameElement

如果有一个iframe是处于沙箱模式,并且没有设置allow-same-origin,那么虽然你可以访问到window.frames的长度为2,但是当你获取window.frames[1].location的时候会有这样的错误:

DOMException: Blocked a frame with origin "http://127.0.0.1:3000" from accessing a cross-origin frame

配置了allow-same-origin的时候:

没有配置allow-same-origin的时候:

  1. window.top: 顶层窗口,即最上层的窗口
  2. window.parent: 父窗口,如果一个窗口没有父窗口,则它的parent属性为自身的引用;
  3. window.self: 当前窗口,即自身的引用;

参考

  1. iframe

driver.get调用iframe中的页面_iframe特性全解读相关推荐

  1. driver.get调用iframe中的页面_【5分钟玩转Lighthouse】爬取JavaScript动态渲染页面

    0x00 背景概述 通过[技术干货 007 | Scrapy爬虫初探]教程,大家应该已经对如何编写爬虫有了一定的认识.但对于较为复杂的网站设计,比如网站页面使用了JavaScript动态渲染,入门级的 ...

  2. iframe中请求页面而session失效时页面跳转问题

    访问相关jsp页面时,往往要先判断用户session是否失效,以便决定是继续业务,还是跳转到登录页面.这个事情我们通常是用过滤器来实现的.由过滤器判断session是否失效,由此来决定请求继续还是跳转 ...

  3. 调用iframe中的函数

    前言 360极速浏览器 13.0.2206.0 (正式版本) (32 位) 操作系统 Windows 10 OS Version 1909 (Build 18363.1379) JavaScript ...

  4. html打印当前页面的函数,js调用iframe实现打印页面内容的方法

    1.程序说明 1) 此程序可以实现选择页面中的区域进行打印,以iframe方式进行打印: 2) 与原生态的print() 区别在于,取消打印页面后可以完整保留当前访问页面的内容. 2.代码部分 1) ...

  5. Selenium WebDriver- 操作 IFrame 中的页面元素

    #encoding=utf-8 importunittestimporttimefrom selenium importwebdriverfrom selenium.webdriver importA ...

  6. 调用iframe中的js方法_SolidWorks中标准件库的创建及调用方法

    在使用SolidWorks进行机械设计时,常用的标准件(如螺栓.螺母.垫圈等)通常可以在安装了SolidWorksToolbox插件后调出使用,而许多标准件在Toolbox并不存在,不能从插件中直接调 ...

  7. Easyweb包括iframe中的页面跳转

    文档地址:常用实例 · EasyWeb开发文档 · 看云 跳转新页面:window.open("test.html"); 本窗口跳转:window.location.assign( ...

  8. .NETCore3.1中的Json互操作最全解读-收藏级

    前言 本文比较长,我建议大家先点赞.收藏后慢慢阅读,点赞再看,形成习惯! 我很高兴,.NETCore终于来到了3.1LTS版本,并且将支持3年,我们也准备让部分业务迁移到3.1上面,不过很快我们就遇到 ...

  9. byte用json存 c++_.NET Core 3.1中的Json互操作最全解读收藏级

    (给DotNet加星标,提升.Net技能) 转自:Ron.Liangcnblogs.com/viter/p/12116640.html 前言 本文比较长,我建议大家先点赞.收藏后慢慢阅读,点赞再看,形 ...

最新文章

  1. CSS3-多媒体查询
  2. Launcher3自定义壁纸旋转后拉伸无法恢复
  3. 用commons-fileupload-1.2 实现文件上传
  4. php 的不等于符号,mysql 不等于 符号写法
  5. charles-无法抓取https包的解决办法及效果
  6. [Asp.net MVC]HandleErrorAttribute异常过滤器
  7. 立镖机器人浙江_立镖现身LogiMAT 2019 彰显中国仓储分拣技术
  8. mysql 的 null值_MySQL NULL值
  9. JavaScript(三)数据类型转换
  10. Java常用设计模式及应用场景介绍
  11. 压缩包上传 压缩并解压缩Rar/Zip
  12. DHCP报文分析及C/C++代码实现
  13. 存储容量及相关计算单位
  14. 机器人编程语言有哪些? 这5大编程语言的优缺点你都了解?
  15. 计算机桌面图标管理,桌面图标管理|轻松管理桌面图标
  16. Last chance to join 500+ others in Australia
  17. 联通沃云开启80端口
  18. swift转场动画_Swift游乐场的演变
  19. Matlab------如何控制matlab中的数据输出格式
  20. 潘多拉 搭建 php服务器,MAYA带你重建潘多拉!

热门文章

  1. 【Android 逆向】Frida 框架 ( Frida 2 种运行模式 | Frida 12.7.5 版本相关工具下载地址 | 在 Android 模拟器上运行 Frida 远程服务程序 )
  2. 显卡测试软件哪个好2018,2018年显卡评测推荐
  3. RedHat 7.0 硬盘挂载操作
  4. openCV-python实现幻灯片渐变效果
  5. Python itchat微信机器人自动回复
  6. 串:串的基本定义及简单应用魔王语言
  7. Linux 下使用 C++ 实现的 Web 文件服务器
  8. python中divmod_python内置函数 divmod()
  9. node 下载图片到本地
  10. 人参皂苷rg3 ,rh2,appd之间的关系