聊聊 iframe, CSP, 安全, 跨域
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, 安全, 跨域的更多相关文章
- iframe无刷新跨域并获得返回值
参考:http://geeksun.iteye.com/blog/1070607 /** * iframe跨域提交大数据 * @param action 跨域地址 * @param arr [ {na ...
- iframe无刷新跨域上传文件并获取返回值
通常我们会有一个统一的上传接口,这个接口会被其他的服务调用.如果出现不同域,还需要无刷新上传文件,并且获取返回值,这就有点麻烦了.比如,新浪微博启用了新域名www.weibo.com,但接口还是使用原 ...
- 黄聪:利用iframe实现ajax 跨域通信的解决方案(转)
原文:http://www.cnblogs.com/xueming/archive/2013/02/01/crossdomainajax.html 在漫长的前端开发旅途上,无可避免的会接触到ajax, ...
- 使用 iframe + postMessage 实现跨域通信
在实际项目开发中可能会碰到在 a.com 页面中嵌套 b.com 页面,这时第一反应是使用 iframe,但是产品又提出在 a.com 中操作,b.com 中进行显示,或者相反. 1.postMess ...
- window.postMessage()实现(iframe嵌套页面)跨域消息传递
window.postMessage()方法可以安全地实现Window对象之间的跨域通信.例如,在页面和嵌入其中的iframe之间. 不同页面上的脚本允许彼此访问,当且仅当它们源自的页面共享相同的协议 ...
- iframe嵌套页面 跨域
父级调用iframe方法: document.getElementById("iframe").contentWindow.func(data1,data2...) 子级 ifra ...
- iframe无刷新跨域上传文件并获得返回值
原文:http://geeksun.iteye.com/blog/1070607 需求:从S平台上传文件到R平台,上传成功后R平台返回给S平台一个值,S平台是在一个页面弹出的浮窗里上传文件,所以不能用 ...
- iframe跨域+
script.image.iframe的src都不受同源策略的影响.所以我们可以借助这一特点,实现跨域.如前面所介绍的JSONP跨域,以及灯标(Beacons). 该篇随笔主要阐述iframe结合一些 ...
- 利用window.name+iframe跨域获取数据详解
详解 前文提到用jsonp的方式来跨域获取数据,本文为大家介绍下如何利用window.name+iframe跨域获取数据. 首先我们要简单了解下window.name和iframe的相关知识.ifra ...
- 关于iframe跨域实践
提要 项目中与到iframe子页面中需要通过top获取在父页面中的全局变量的需求,由于App部署的缘故,导致父页面和iframe子页面分别在不同的端口下,导致iframe跨域现象,通过查阅资料进行问题 ...
随机推荐
- 解决方案 | PPT右键复制文本时右键粘贴选项按钮为空白
1.问题 2.解决方法 随便复制一些文字,不要采用CRTL+V,而是采用右键粘贴方法到ppt中,选择纯文本的"A"符号. 之后再使用CTRL+C复制,CTRL+V即正常.(好像只能 ...
- [oeasy]python0012_程序写错了怎么办
运行python文件_报错处理_NameError 回忆上次内容 回忆 上次内容 vi oeasy.py 用 vi 编辑 oeasy.py cat oeasy.py 用 cat 查看 oeasy. ...
- [oeasy]python0084_扩展BCD_EBCDIC_ibm的发家史
编码进化 回忆上次内容 上次 回顾了 数字 进入二进制世界的 过程 采用的编码 是 BCD Binary Coded Decimal 也叫8421码 十进制数的 二进制形态 数字的 输出形式 辉光管 ...
- 欧拉系统初体验与编译安装FFmpeg的过程记录
目录 源起 1. 系统下载 2. 系统安装 2.1 磁盘分区 2.2 软件数量 2.3 安装完毕 3.进入系统 4.安装FFmpeg 4.1 下载FFmpeg 4.2 解压程序 4.3 检查环境 4. ...
- PowerShell 使用 Azure
PowerShell 使用 Azure Azure 提供了三种管理工具: Azure 门户:Azure 门户是一个网站,可在其中创建.配置和更改 Azure 订阅中的资源,该门户是一个图形用户界面 ( ...
- Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解
$remote_addr 代表客户端IP.注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端.假设用户请求过程如下: 用户客户端--发送请求->Nginx1 --转发请求-- ...
- LOTO示波器功率分析功能
LOTO示波器软件在非标功能中增加了功率分析功能,对当前屏幕的电压波形和电流波形进行了瞬时功率,视在功率以及有功功率/平均功率的分析计算. 有功功率是指电器所消耗的电能,用于产生热能.机械能或光能等, ...
- Python版RNA-seq分析教程:差异表达基因分析
Bulk RNA-seq 分析的一个重要任务是分析差异表达基因,我们可以用 omicverse包来完成这个任务.对于差异表达分析而言,首先,我们可> 以先将 gene_id 改为 gene_na ...
- Jmeter函数助手16-StringFromFile
StringFromFile函数用于获取文本文件的值,一次读取一行,可读取多个文件. 输入文件的全路径:填入文件路径 存储结果的变量名(可选) Start file sequence number ( ...
- Arm V8 - ADRP指令
ADRP指令 作用 将当前指令所在页的基地址加/减去字节差,并写入目标寄存器 字节差:与目标地址页基地址的间隔字节数,其为PAGE_SIZE的整数倍 此时的字节差就是指令所操作的立即数 该指令通常配合 ...