refer :

https://www.cnblogs.com/kunmomo/p/12131818.html (跨域)

https://segmentfault.com/a/1190000004502619 (iframe)

https://imququ.com/post/content-security-policy-reference.html (CSP)

https://stackoverflow.com/questions/25098021/securityerror-blocked-a-frame-with-origin-from-accessing-a-cross-origin-frame (post message example)

上面写的很好了, 记入一些重点就好

怎样算跨域? 

什么东西会被影响 

还有 iframe 之间沟通

如果要跨域沟通怎么办? 

ajax 的做法是通过服务器添加 header access-control-allow-origin

ifame 有 2 个方法

如果是子域名的话可以通过修改 document.domain 来实现跨域

2 个页面都设置成顶级域名这样.

另一个方法是使用 html5 的 post message, 这个比较厉害, 任何网站都可以沟通哦. 如果我没有记错的话, web worker 也是类似的方式沟通的.

Iframe 使用

iframe 有 2 个方向, 第一个是我们使用 iframe 嵌套人家网站进来.

另一个是反过来,我们被人家网站嵌套.

我先说说被嵌套的情况.

如果我们不想被嵌套可以在服务器返回的 response header 里头加入

X-Frame-Options, 或者比较新的 CSP

app.Use(async (context, next) =>
{
//context.Response.Headers.Append("X-Frame-Options", "SAMEORIGIN");
//context.Response.Headers.Append("X-Frame-Options", "DENY");
//context.Response.Headers.Append(HeaderNames.XFrameOptions, "ALLOW-FROM https://localhost:44338"); //context.Response.Headers.Append("Content-Security-Policy", "frame-ancestors self");
//context.Response.Headers.Append("Content-Security-Policy", "frame-ancestors");
//context.Response.Headers.Append(HeaderNames.ContentSecurityPolicy, "frame-ancestors https://localhost:44338");
await next();
});

same origin 就是说只有同域才可以嵌套 (怎样算跨域上面已经说了)

deny 就是完全不行咯

allow-from 就是自己写允许哪些网站可以嵌套.

这里只是说它能不能嵌套你, 虽然它可以嵌套你, 也不代表它就可以操作你哦. (沟通依然是受保护的, 这个防嵌套主要是用来防 clickjacking 的)

iframe 通讯

parent page

在跨域的情况下, 虽然我们无法直接访问 frame.contentWindow, 但是却可以调用 post message 哦

<iframe id="iframe3" src="https://192.168.1.152:44300"></iframe>
<script>
setTimeout(() => {
const frame = document.getElementById('iframe3');
frame.contentWindow.postMessage('message', 'https://192.168.1.152:44300');
}, 4000); window.addEventListener('message', event => {
if (event.origin.startsWith('https://192.168.1.152:44300')) {
console.log('callback data here : ' + event.data);
} else {
return;
}
});
</script>

嵌套的 page

window.addEventListener('message', event => {
document.getElementById('target').innerHTML = 'masuk';
if (event.origin.startsWith('https://localhost:44338')) {
document.getElementById('target').innerHTML = 'get message' + event.data;
window.top.postMessage('callback' + event.data, 'https://localhost:44338');
} else {
return;
}
});

记得一定要判断 event.origin, 因为各种情况下都有可能会收到 message 的 (比如你安装了 angular 的游览器 debug 插件, 它就会一直出发 message event)

聊聊 iframe, CSP, 安全, 跨域的更多相关文章

  1. iframe无刷新跨域并获得返回值

    参考:http://geeksun.iteye.com/blog/1070607 /** * iframe跨域提交大数据 * @param action 跨域地址 * @param arr [ {na ...

  2. iframe无刷新跨域上传文件并获取返回值

    通常我们会有一个统一的上传接口,这个接口会被其他的服务调用.如果出现不同域,还需要无刷新上传文件,并且获取返回值,这就有点麻烦了.比如,新浪微博启用了新域名www.weibo.com,但接口还是使用原 ...

  3. 黄聪:利用iframe实现ajax 跨域通信的解决方案(转)

    原文:http://www.cnblogs.com/xueming/archive/2013/02/01/crossdomainajax.html 在漫长的前端开发旅途上,无可避免的会接触到ajax, ...

  4. 使用 iframe + postMessage 实现跨域通信

    在实际项目开发中可能会碰到在 a.com 页面中嵌套 b.com 页面,这时第一反应是使用 iframe,但是产品又提出在 a.com 中操作,b.com 中进行显示,或者相反. 1.postMess ...

  5. window.postMessage()实现(iframe嵌套页面)跨域消息传递

    window.postMessage()方法可以安全地实现Window对象之间的跨域通信.例如,在页面和嵌入其中的iframe之间. 不同页面上的脚本允许彼此访问,当且仅当它们源自的页面共享相同的协议 ...

  6. iframe嵌套页面 跨域

    父级调用iframe方法: document.getElementById("iframe").contentWindow.func(data1,data2...) 子级 ifra ...

  7. iframe无刷新跨域上传文件并获得返回值

    原文:http://geeksun.iteye.com/blog/1070607 需求:从S平台上传文件到R平台,上传成功后R平台返回给S平台一个值,S平台是在一个页面弹出的浮窗里上传文件,所以不能用 ...

  8. iframe跨域+

    script.image.iframe的src都不受同源策略的影响.所以我们可以借助这一特点,实现跨域.如前面所介绍的JSONP跨域,以及灯标(Beacons). 该篇随笔主要阐述iframe结合一些 ...

  9. 利用window.name+iframe跨域获取数据详解

    详解 前文提到用jsonp的方式来跨域获取数据,本文为大家介绍下如何利用window.name+iframe跨域获取数据. 首先我们要简单了解下window.name和iframe的相关知识.ifra ...

  10. 关于iframe跨域实践

    提要 项目中与到iframe子页面中需要通过top获取在父页面中的全局变量的需求,由于App部署的缘故,导致父页面和iframe子页面分别在不同的端口下,导致iframe跨域现象,通过查阅资料进行问题 ...

随机推荐

  1. Django日期字段默认值default=timezone.now

    如果你确实希望默认值是当前日期和时间,Django 提供了一个方便的函数 django.utils.timezone.now 来实现这一目的. 你可以这样调整你的模型,以使用当前日期和时间作为默认值: ...

  2. Known框架实战演练——进销存数据结构

    系统主要包含商品信息.商业伙伴(客户.供应商)信息.业务单表头信息.业务单表体信息.对账单表头信息.对账单表体信息. 1. 商品信息(JxGoods) 该表用于存储公司商品信息. 名称 代码 类型 长 ...

  3. Pandas库学习笔记(6) -- Pandas 基本方法

    Pandas 基本方法实例 到目前为止,我们了解了三个Pandas DataStructures以及如何创建它们.由于它在实时数据处理中的重要性,因此我们将主要关注DataFrame对象,并讨论其他一 ...

  4. UE5 打包DedicatedServer

    UE5开发Dedicate Server直接按教程用Replicated那种蓝图开发即可. 如果打包的话,服务器端需要无界面的运行模式,不同于正常的开发,所以为了打包,这里步骤如下: 1.到githu ...

  5. yum密钥报错

    解决报错 [root@node3 mnt]# cat /etc/yum.repos.d/local.repo [BaseOS_repo] baseurl = file:///mnt/BaseOS en ...

  6. a-from提交时遇到errorFields:[]验证错误(vue3)

    应用场景:使用a-form组件,里面使用a-select组件:当a-select组件内的值发生改变时,调用a-form的验证表单,进而提交. 问题:提交时遇到errorFields:[]验证错误 解决 ...

  7. iOS开发基础144-逐字打印效果

    在AIGC类的APP中,实现那种一个字一个字.一行一行地打印出文字的效果,可以通过多种方法来实现.下面是一些实现方法,使用Swift和OC来举例说明. OC版 1. 基于定时器的逐字打印效果 可以使用 ...

  8. web3 产品介绍: safe --多签钱包 多人审批更放心

    Safe是一款由Gnosis团队开发的多签钱包,它提供了一种安全.灵活和易于使用的方式来管理加密资产.在本文中,我们将介绍Safe的主要特点以及如何使用Safe来保护您的数字资产. 一.Safe的特点 ...

  9. DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑

    共享纹理 老游戏使用directx9无法直接与cc高光sdk(d3d11)对接,但是d3d9ex有共享纹理,我们通过共享纹理把游戏画面共享给cc录制,记录一些踩坑的笔记. 共享纹理示例: // 初始化 ...

  10. 深度解读昇腾CANN小shape算子计算优化技术,进一步减少调度开销

    摘要:Host调度模式下,GE将模型中算子的执行单元划分为Host CPU执行与Device(昇腾AI处理器)执行两大类. 本文分享自华为云社区<深度解读昇腾CANN小shape算子计算优化技术 ...