iframe如何用?常见的一些套路

news/2025/2/22 15:47:23/

文章目录

    • 🌊什么是iframe
      • 我们来看一个demo
      • iframe的常用属性
      • iframe的优缺点
    • 🌊点击劫持和安全策略
    • 🌊postMessage通信
      • postMessage
    • 🌊iframe如何解决跨域
    • 资源链接

🌊什么是iframe

iframe 标签规定一个内联框架。内联框架就是在一个页面中嵌入另一个页面。

由于 iframe 可能在某些方面不符合标准网页设计的理念,已经被HTMLl5抛弃,目前的HTML5不再支持它了

我们来看一个demo

./code/iframe1.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><iframe src='https://www.juejin.cn' width="100%" height="300px"></iframe>
</body>
</html>

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=.%2Fimg%2Fimage.png&pos_id=img-vCizchFe-169337764

如果我们把链接换成www.baidu.com, 就会受到策略限制
./code/iframe2.html
在这里插入图片描述

iframe的常用属性

  • frameborder
  • width
  • height
  • name
  • src
  • scrolling
  • sandbox 安全限制`
    • alallow-scripts 允许运行脚本
    • allow-downlods 允许下载
    • allow-same-origin 允许同域请求:ajax
    • allow-top-navigation 允许使用顶层上下文的导航: window.top
    • allow-popups 允许从 iframe 中弹出新窗口:window.open
    • allow-forms 允许 form 表单提交

更加详细的属性解释,看下方的MDN链接

iframe的优缺点

优点

  • 使用起来很方便
  • 方便开发,减少代码的重复率
    缺点
  • 部分使用会产生跨域
  • 浏览器后退按钮无效

🌊点击劫持和安全策略

  • CSP(Content Security Policy,即内容安全策略)

    Content Security Policy (CSP) 是一种网络安全策略,用于减少和报告网站上的 XSS (跨站脚本)、数据注入和点击劫持等攻击。
    CSP 通过定义合法的内容来源,限制浏览器加载和执行特定资源的方式。它基于白名单原则,只允许来自特定源的内容加载和执行,阻止任何不在白名单上的资源,从而防止恶意脚本的执行。
    CSP 允许网站管理员制定一系列的策略指令,这些指令告诉浏览器可以执行哪些任务和从哪些地方加载资源。常见的 CSP 指令包括 default-src、script-src、style-src、img-src 等。
    CSP 的优点是可以减少许多客户端的攻击,提高网站的安全性。然而,配置 CSP 需要考虑到网站的需求和资源来源,因此需要进行正确的配置和测试,以确保不影响网站的正常运行。

🌊postMessage通信

我们先来看一个例子(我们可以借助vscode的一个插件Live Server来启动服务)

project1

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><h1>项目一</h1><iframe src="http://127.0.0.1:5500/docs/repository/temp_lihegui/pro2/index.html" frameborder="0" width="300px"height="300px"></iframe><script>window.addEventListener('message', (event) => {console.log("监听到了");console.log('====================================');console.log(event.data);console.log('====================================');})</script>
</body></html>

project2

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><h1 onclick="publish()">项目二</h1><script>function publish() {console.log('publish');window.parent.postMessage({messgae:'传输'}, '*')}</script>
</body></html>

💣遇到的坑

如果受同源协议限制,window.parent获取到数据都是空壳原始数据,但是这个方法还是可以用的

postMessage

window.postMessage() 方法允许来自一个文档的脚本可以传递文本消息到另一个文档里的脚本,而不用管是否跨域。一个文档里的脚本还是不能调用在其他文档里方法和读取属性,但他们可以用这种消息传递技术来实现安全的通信。

参数说明

  • message:要发送的消息内容。它可以是任何 JavaScript 可序列化的对象或基本类型。
  • targetOrigin:目标窗口的 URL。只有与目标窗口的 URL 完全匹配时,消息才会被发送。这是为了防止恶意代码发送消息到不受信任的窗口。
  • transfer:一个可选的数组,包含需要传递到目标窗口的 Transferable 对象。Transferable 对象是一些特定类型的对象,如 ArrayBuffer 和 MessagePort,它们可以在窗口间转移所有权,而不是进行复制操作。这可以提高性能,尤其是对于大型数据。

应用场景

  • 页面和其打开的新窗口的数据传递
  • 页面与嵌套的 iframe 消息传递
  • 多窗口之间消息传递

🌊iframe如何解决跨域

在嵌入的网页和包含 iframe 的页面之间存在一个同源策略。即使 iframe 的协议与页面的协议相同,如果它们的域名、端口号或协议之一不匹配,那么 iframe 将被认为不是同源,访问其中的内容将受到限制。

大多数解决办法都是更改协议,这种当方式往往不现实,一般需求可以通过

  • URL传递参数✔️
  • postMessage来进行通信✔️

这两种方式还是可以的

跨域在这里就不多说了

资源链接

一个容易被忽视的标签 —— iframe
postMessage - 跨域消息传递
[MDN文档]https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe


http://www.ppmy.cn/news/1074409.html

相关文章

【数据结构】Golang 实现单链表

概念 通过指针将一组零散的内存块串联在一起 &#xff0c; 把内存块称为链表的“结点”。 记录下个结点地址的指针叫作后继指针 next &#xff0c;第一个结点叫作头结点&#xff0c;把最后一个结点叫作尾结点 。 代码实现 定义单链表 在 golang 中可以通过结构体定义单链表…

高基数类别特征预处理:平均数编码 | 京东云技术团队

一 前言 对于一个类别特征&#xff0c;如果这个特征的取值非常多&#xff0c;则称它为高基数&#xff08;high-cardinality&#xff09;类别特征。在深度学习场景中&#xff0c;对于类别特征我们一般采用Embedding的方式&#xff0c;通过预训练或直接训练的方式将类别特征值编…

docker命令整理

一、docker镜像 查找镜像&#xff1a;docker search 镜像名 拉取镜像&#xff1a;docker pull 镜像名:标签 删除镜像&#xff1a;docker rmi 镜像名:标签 进入Dockerfile目录&#xff0c;使用Dockerfile构建镜像&#xff1a;docker build -t testimg:v1.0 . 二、创建容器并运行…

使用生成式 AI 和 ML 模型进行电子邮件和移动主题行优化

结合使用生成式 AI 和 ML 模型,根据语气和受众自动创建引人注目的主题行和标题,以实现最大程度的参与。 电子邮件和推送通知的主题行和标题在确定参与率方面发挥着重要作用。数字通信需要精心设计引人注目的主题行和简洁的推送通知标题来吸引用户的注意力。营销人员根据要传递…

LCD驱动

一、Linux 下 LCD 驱动简析 1.与裸机的异同 在 Linux 中应用程序最终也是通过操作 RGB LCD 的显存来实现在 LCD 上显示字符、图片等信息&#xff0c;但是Linux系统的内存管理严格&#xff0c;使用显存需要申请&#xff0c;因为虚拟内存的存在&#xff0c;驱动程序设置的显存和应…

股票历史数据下载 api

1 网址 Nasdaq Data Link 2 url 测试 https://www.quandl.com/api/v3/datasets/WIKI/AAPL.json?api_key注册的apikey 3 Quandl提供不同的订阅计划&#xff0c;每个订阅计划都有不同的数据访问权限和API请求次数限制。具体收费方式如下&#xff1a;免费订阅计划&#xff1…

AUTOSAR从入门到精通-【应用篇】参照AUTOSAR架构的柴油车后处理集成电控系统软件设计与研究(续)

目录 3.3底层驱动模块开发 3.3.1利用S-Function编写底层驱动模块 3.3.2编写TLC文件来控制自动代码生成过程

Android 之 LayoutInflater (布局服务)

本节引言&#xff1a; 本节继续带来的是Android系统服务中的LayoutInflater(布局服务)&#xff0c;说到布局&#xff0c;大家第一时间 可能想起的是写完一个布局的xml&#xff0c;然后调用Activity的setContentView()加载布局&#xff0c;然后把他显示 到屏幕上是吧~其实这个底…