到目前为止,您应该掌握了将图像\视频和音频嵌入到网页上的诀窍了。此刻,让我们进行深入学习,来看一些能让您在网页中嵌入各种内容类型的元素: <iframe>, <embed> 和<object> 元素。<iframe>用于嵌入其他网页,另外两个元素则允许您嵌入PDF,SVG,甚至Flash(种正在被淘汰的技术,但您仍然会时不时的看到它)。

1.1      嵌入的简史

很久以前,在网络上使用框架创建网站 - 有一小部分存储于个人HTML页面的网站是受欢迎的。这些嵌入在一个称为框架集的主文档中,允许您指定每个框架填充的屏幕上的区域,而不是像表格的列和行的大小。这些被认为是90年代中期至90年代的凉爽的高度,有证据表明,将网页分解成较小的块,这样更适合下载速度 - 尤其是网络连接如此缓慢。然而,他们有很多问题,远远超过网络速度更快的任何积极因素,所以你看不到它们被使用了。

过了一段时间后(20世纪90年代末,21世纪初),插件技术变得非常受欢迎,例如Java Applet和Flash - 这些允许网络开发者将丰富的内容嵌入到视频和动画等网页中,这些网页只能通过HTML单独使用。嵌入这些技术是通过诸如<object>和较少使用<embed>的元素来实现的,当时它们非常有用。由于许多问题,包括可访问性、安全性、文件大小等,它们已经过时了; 现如今,大多数移动设备不再支持这样的插件,桌面也逐渐不再支持。

最后,<iframe>元素出现了(连同其他嵌入内容的方式,如<canvas>,<video>等),它提供了一种将整个web页嵌入到另一个网页的方法,看起来就像那个web页是另一个网页的一个<img>或其他元素一样。<iframe>现在经常被使用。

1.2      Iframe详解

是不是很简单又有趣呢?<iframe>元素旨在允许您将其他Web文档嵌入到当前文档中。这很适合将第三方内容纳入您的网站,您可能无法直接控制,也不希望实现自己的版本 - 例如来自在线视频提供商的视频,Disqus等评论系统,在线地图提供商,广告横幅等。您通过本课程使用的实时可编辑示例使用<iframe> 实现。

关于<iframe>有一些严重的安全隐患需要考虑,但这并不意味着你不应该在你的网站上使用它们 - 它只需要一些知识和仔细的思考。让我们更详细地探索这些代码。假设您想在其中一个网页上加入MDN词汇表,您可以尝试以下方式:

<iframe src="https://developer.mozilla.org/en-US/docs/Glossary"

width="100%" height="500" frameborder="0"

allowfullscreen sandbox>

<p> <a href="https://developer.mozilla.org/en-US/docs/Glossary">

Fallback link for browsers that don't support iframes

</a> </p>

</iframe>

此示例包括使用以下所需的基本要素<iframe>:

allowfullscreen

如果设置,<iframe>则可以使用全屏API放置在全屏模式(稍微超出本文的范围)。

frameborder

如果设置为1,则会告诉浏览器在此框架和其他框架之间绘制边框,这是默认行为。0删除边框。不推荐这样设置,因为在CSS中可以更好地实现相同的效果。border: none;

src

该属性与<video>/<img>一样包含指向要嵌入的文档的URL的路径。

width 和 height

这些属性指定您想要的iframe的宽度和高度。

备选内容

与<video>等其他类似元素相同,您可以在打开和关闭<iframe></iframe>标签之间包含备选内容,如果浏览器不支持,将会显示<iframe>。在这种情况下,我们已经添加了一个链接到页面。您几乎不可能遇到任何不支持<iframe>的浏览器。

sandbox

该属性比其他<iframe>功能(例如IE 10及更高版本)稍微更现代的浏览器工作,要求提高安全性设置; 我们将在下一节中再说一遍。

注意:为了提高速度,在主内容完成加载后,使用JavaScript设置iframe的src属性是个好主意。这使您的页面可以更快地使用,并减少您的官方页面加载时间(重要的SEO指标)。

1.3      安全隐患

以上我们提到了安全问题 - 现在我们来详细介绍一下这一点。我们并不期望您第一次完全理解所有这些内容; 我们只想让您意识到这一问题,并为您提供参考,让您更有经验,并开始考虑<iframe>在您的实验和工作中使用。此外,没有必要害怕和不使用<iframe>- 你只需要谨慎一点。继续看下去。

浏览器制造商和Web开发人员已经学会了如何使用iframe 作为网络上的坏人(通常被称为黑客,或更准确地说是破解者)的共同目标(官方术语:攻击向量),如果他们试图恶意修改您的网页或欺骗人们进行不想做的事情,例如显示用户名和密码等敏感信息。因此,规范工程师和浏览器开发人员已经开发了各种安全机制,使其更加安全,并且还有最佳实践要考虑 - 我们将在下面介绍其中的一些。

单击劫持是一种常见的iframe攻击,黑客将隐藏的iframe嵌入到您的文档中(或将您的文档嵌入自己的恶意网站),并使用它来捕获用户的交互。这是误导用户或窃取敏感数据的常见方式。

一个快速的例子,尽管如此 - 尝试加载在浏览器中上面的例子 - 你可以在Github上找到它(参见源代码)。你不会看到页面上显示的内容,如果你点击浏览器开发者工具中的控制台,你会看到一条消息,告诉你为什么。在Firefox中,您会被X-Frame-Options拒绝加载:https://developer.mozilla.org/en-US/docs/Glossary不允许框架化。这是因为构建MDN的开发人员已经在服务于网站页面的服务器上设置了一个不允许嵌入<iframe>的设置(请参阅配置CSP指令)这是有必要的 - 整个MDN页面嵌入在其他页面中并不真实,除非您想要将其嵌入到您的网站上并将其声称为自己的内容,或尝试通过以下方式窃取数据:点击劫持,这两个都是非常糟糕的事情。此外,如果每个人都开始这样做,所有额外的带宽将开始花费Mozilla很多资金。

1.4      只有在必要时嵌入

有时嵌入第三方内容(例如优酷视频和地图)是有意义的,但如果您只在完全需要时嵌入第三方内容,您可以省去很多麻烦。网络安全的一个很好的经验法则是“你怎么谨慎都不为过,如果你决定要做这件事,多检查一遍;如果是别人做的,在被证明是安全的之前,都假设这是危险的。”

除了安全问题,你还应该意识到知识产权问题。无论在线内容还是离线内容,绝大部分内容都是有版权的,甚至是一些你没想到有版权的内容(例如,Wikimedia Commons上的大多数图片)。不要在网页上展示一些不属于你的内容,除非你是所有者或所有者给了你明确的、书面的许可。对于侵犯版权的惩罚是严厉的。再说一次,你再小心也不为过。

如果内容获得许可,你必须遵守许可条款。例如,MDN上的内容是在CC-BY-SA下许可的,这意味着,如果你要引用我们的内容,就必须用适当的方式注明来源,即使你对内容做了实质性的修改。

1.5      使用 HTTPS

HTTPS是HTTP的加密版本。您应该尽可能使用HTTPS为您的网站提供服务:

HTTPS减少了远程内容在传输过程中被篡改的机会,

HTTPS防止嵌入式内容访问您的父文档中的内容,反之亦然。

使用HTTPS需要一个安全证书,这可能是昂贵的(尽管Let's Encrypt让这件事变得更容易),如果你没有,可以使用HTTP来为你的父文档提供服务。但是,由于HTTPS的第二个好处,无论成本如何,您绝对不能使用HTTP嵌入第三方内容(在最好的情况下,您的用户的Web浏览器会给他们一个可怕的警告)。所有有声望的公司,例如Google Maps或Youtube,当您嵌入内容时,<iframe>将通过HTTPS提供 - 查看<iframe> src属性内的URL。

1.6      始终使用sandbox属性

你想给攻击者尽可能少的机会在你的网站上做坏事,那么你应该只给嵌入式内容工作所需的权限。当然,这也适用于你自己的内容。一个代码可以适当使用或用于测试的容器,但不能对其他代码库(意外或恶意)造成任何损害称为沙箱。

未沙盒化(Unsandboxed)内容可以做得太多(执行JavaScript,提交表单,弹出窗口等)默认情况下,您应该使用没有参数的sandbox属性来强制执行所有可用的限制,如我们前面的示例所示。

如果绝对需要,您可以逐个添加权限(sandbox=""属性值内) - 请参阅sandbox所有可用选项的参考条目。其中重要的一点是,你永远不应该同时添加allow-scripts和allow-same-origin到你的sandbox属性中-在这种情况下,嵌入的内容可以绕过,从执行脚本停止网站同源安全策略,并使用JavaScript来关闭完全沙箱。

注意:如果攻击者可以直接(外部iframe)愚弄人们访问恶意内容,Sandboxing不提供任何保护。如果某些内容有可能是恶意的(例如,用户生成的内容),请将其从不同的域服务到您的主要网站。

1.7      配置CSP指令

CSP代表内容安全策略,它提供一组HTTP标头(由web服务器发送时与元数据一起发送的元数据),旨在提高HTML文档的安全性。在<iframe>安全性方面,您可以将服务器配置为发送适当的X-Frame-Options  标题。这样做可以防止其他网站在其网页中嵌入您的内容(这将导致点击和一系列其他攻击),正如我们之前看到的那样,MDN开发人员已经做了这些工作。

注意:您可以阅读Frederik Braun的帖子在X-Frame-Options安全性头上来获取有关此主题的更多背景信息。显然,在这篇文章中已经解释得很清楚了。

HTML中的嵌入技术的更多相关文章

  1. 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html

    #网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...

  2. tp中使用分页技术

    1 public function showList() { $m_ld = D ( 'guangxi_ld' ); $page = I ( 'get.p', 1 ); // 在配置中获取分页值 $p ...

  3. Web 开发中应用 HTML5 技术的10个实例教程

    HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...

  4. 【python游戏编程之旅】第七篇---pygame中的冲突检测技术

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...

  5. .net中对象序列化技术浅谈

    .net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...

  6. SpreadJS 中应用 KnockoutJS 技术

    SpreadJS 支持 Knockout (KO)技术, KnockoutJS 是一个使用 MVVM 模式的 JavaScript 库,允许双向数据绑定,使数据和UI界面进行实时的交互更新.关于KO的 ...

  7. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

  8. GPRS GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可用的一种移动数据业务,属于第二代移动通信中的数据传输技术

    GPRS 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可 ...

  9. Android中直播视频技术探究之---基础知识大纲介绍

    一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...

随机推荐

  1. 2016级算法期末上机-I.难题·ModricWang's Fight with DDLs III

    1126 ModricWang's Fight with DDLs III 思路 由于题目中已经说明了时间经过了正无穷,因此初始位置是不重要的,并且每条边.每个点的地位是均等的.因此到达每个点的概率就 ...

  2. 南昌 Max answer

    https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value of a interva ...

  3. Linux网络编程服务器模型选择之IO复用循环并发服务器

    在前面我们介绍了循环服务器,并发服务器模型.简单的循环服务器每次只能处理一个请求,即处理的请求是串行的,效率过低:并发服务器可以通过创建多个进程或者是线程来并发的处理多个请求.但是当客户端增加时,就需 ...

  4. Java NIO开发需要注意的陷阱(转)

    陷阱1:处理事件忘记移除key在select返回值大于0的情况下,循环处理Selector.selectedKeys集合,每处理一个必须从Set中移除 Iterator<SelectionKey ...

  5. hadoop-2.6.0-cdh5.4.5.tar.gz(CDH)的3节点集群搭建(含zookeeper集群安装)

    前言 本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接 http://www.cnblogs.com/zlslch/p/ ...

  6. ServiceLoader解读

    SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或者插件的.在java.util.ServiceLoader的文档里有比较详细的介绍. 简 ...

  7. pip 更换国内源

    centos 下 没有找到 pip.conf 操作如下: 进入主目录:cd ~ 创建 .pip 目录: mkdir .pip 进入.pip 创建 pip.conf 文件:cd .pip/ touch ...

  8. java外观模式(Facade)

    1.外观模式(Facade [fə'sɑd] n. 正面:表面:外观) 外观模式:可以理解为 中介模式(没错,就是在用户与系统之间,增加了一个类,而这个类就是外观类,所以这个模式就叫外观模式) 如下图 ...

  9. MYSQL5.7 sql_mode=only_full_group_by

    错误提示: .... which is not functionally dependent on columns in GROUP BY clause; this is incompatible w ...

  10. js中json对象数组按对象属性排序

    在实际工作经常会出现这样一个问题:后台返回一个数组中有i个json数据,需要我们根据json中某一项进行数组的排序. 例如返回的数据结构大概是这样: { result:[ {id:,name:'中国银 ...