通过iframe嵌入三方系统时遇到的跨域问题及解决方案

本文讲述了在Vue3项目中通过iframe嵌入General和Elasticsearch监控页面遇到的问题,包括X-Frame-Options导致的页面加载失败、Elasticsearch登录问题及跨域获取iframeDOM元素失败。解决方法包括调整X-Frame-Options设置、处理SameSite和SecureCookie策略以及利用CORS进行跨域通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

项目中部署了General 和 Elastic kabana来监控服务器性能,因为部署在不同的服务器,每次查看时需要打开不同的系统,非常麻烦,所以将他们内嵌到中心系统里方便查看。

实现方式

前端使用vue3,通过路由meta获取iframe加载的url。

const frameSrc = ref<string>("");
if (unref(currentRoute.meta)?.frameSrc) {
  frameSrc.value = unref(currentRoute.meta)?.frameSrc as string;
}

<iframe :src="frameSrc" class="frame-iframe" ref="frameRef" />

问题1:通过iframe嵌入后,页面无法正常加载

控制台报错Refused to display 'http://xxx.xxx.xxx.xxx:8008/' in a frame because it set 'X-Frame-0ptions' to 'deny'

原因:
当目标网站设置了X-Frame-OptionsDENYSAMEORIGIN时,会导致目标网址无法被通过iframe加载。

解决方案:
将目标网址的X-Frame-0ptions设置为 ALLOW-FROM uri:表示页面只能被指定uri的iframe嵌入。

问题2:Elastic目标页面可正常加载,但无法登录

查看Elastic kabana官方文档 需将xpack.security.sameSiteCookies 设置为none

Cookie SameSite标记:

SameSite:默认情况下,浏览器要求跨站点的第三方Cookie具有SameSite属性设置(通常为Lax或Strict)。如果子系统返回的Cookie没有设置SameSite属性,或者设置为None并且没有Secure标记,浏览器也会拒绝接受该Cookie。

但这简单的操作之后并无法正常访问,继续排查。

Cookie Secure标记:

Secure标记是指当浏览器向服务器发送请求时,只有使用HTTPS协议的连接才会传递该Cookie。如果服务器返回的Set-Cookie头部没有包含Secure标记,浏览器就会拒绝接收该Cookie,并将其视为不安全的Cookie。

SameSite=none 只支持HTTPS接口。如果要设置该值,需要在对应的Cookie上同时设置Secure属性

解决方案:

将目标地址访问方式升级为https,并添加Secure标记

问题3:获取iframe页面中的dom元素失败

因嵌入的第三方系统与父系统是完全不一样的用户体系,并且没必要做统一认证,所以想要在iframe中直接获取到用户名密码输入框模拟自动登录,但在控制台中报错。

获取方式:


const frameRef = ref<HTMLElement | null>(null);

const iframe = unref(frameRef);
const usernameInput =iframe.contentWindow.document.getElementsByClassName("username");
console.log(usernameInput);

<template>
   <iframe :src="frameSrc" class="frame-iframe" ref="frameRef" />
</template>

错误信息:
Uncaught DOMException: Blocked a frame with origin "http://localhost:8848" from accessing a cross-origin frame

原因:出现这个错误的原因是因为存在跨域安全限制,阻止了不同源的页面访问另一个页面。这是出于安全和隐私的考虑所制定的策略。

解决方案:

  1. 若可修改第三方系统,可改造第三方系统,通过子系统调用 postMessage Api实现向父页面通讯
  2. 将第三方系统与父系统部署到同域下,可实现在父页面操作iframe中的内容

小结

通过iframe嵌入第三方系统时,通常第三方系统为了保障系统安全,一般会禁止被嵌入,可以在保证安全的情况下,修改目标地址的被访问策略来实现

  1. X-Frame-Options限制
  2. 站点会话和Cookie策略
  3. 跨域资源共享(CORS)限制
  4. 跨域限制、Secure标记和SameSite属性
### 回答1: 当一个网页通过iframe标签将另一个网页嵌入到自己的页面,如果这两个网页分别属于不同的名,那么就会出现问题。因为浏览器会将这两个网页视为不同的源,从而导致在嵌入网页之间进行数据传递出现安全性问题。 为了解决这个问题,我们可以采取如下几种方法: 1. 使用代理服务器:在原有网页中通过Ajax请求向代理服务器发送请求,然后代理服务器将请求转发给目标网页,并且将返回结果传递回来。这种方法比较简单,但是需要额外的服务器资源和间消耗,同也会带来额外的网络延迟。 2. 使用JSONP技术:JSONP允许我们在页面中通过Script标签引入另一个网页的数据,从而实现数据交换。但是这个方法只适用于传递JSON格式的数据,而且需要目标网页支持JSONP通信。 3. 使用postMessage方法:postMessage是HTML5中新增加的方法,可以通过安全的方式在不同的窗口之间进行文档通信。我们可以在嵌入的网页中使用postMessage方法向原网页发送消息,并且在原网页中又可以使用onmessage事件监听到这些消息,从而完成数据传递。这个方法比较安全,而且不需要额外的服务器资源,但是需要浏览器的支持。 总之,为了避免问题带来的安全隐患,我们需要选择合适的方式来进行数据通信。 ### 回答2: 当一个网页中嵌入了另一个名下的页面,就会涉及到问题。在iframe嵌入三方网站,不允许使用JavaScript访问嵌入页面内容。这是因为浏览器的同源策略限制了对不同名下页面的访问。 为了解决iframe嵌入三方网站问题,可以采用以下方法: 1.代理。通过后端代理,将第三方页面内容转发到自己网站的页面中展示。这种方法需要后端实现,对服务器性能要求较高。 2.JSONP。使用动态脚本,将第三方网页内容以JSONP方式返回到自己网站上展示。这种方法需要第三方网站允许在URL参数中携带回调函数名。 3.postMessage。使用HTML5中提供的API,文档通信,向嵌入的第三方页面发送消息或从页面接收消息。这种方法支持现代浏览器,对前端代码要求较高。 总的来说,针对不同的情况,可以采用不同的方法解决iframe嵌入三方网站问题。 ### 回答3: iframe嵌入三方网站指的是在一个网页中嵌入了来自另外一个名下的网页,这就涉及到了浏览器的同源策略限制。同源策略(Same Origin Policy)是指一个网站的脚本只能操作同源网站的文档或者其他资源。 如果一个网页要嵌入来自不同名的iframe内容,会受到同源策略的限制,导致该iframe无法正常加载,甚至导致整个网页无法运行。 为了解决这个问题,需要通过资源共享(CORS)、JSONP等技术解决。其中,CORS是一种机制,允许服务器进行指定源和目标服务器之间的数据传输。在这种情况下,服务器通过特殊的HTTP头授权浏览器访问资源。而JSONP则是一种利用网页动态加载script标签的技术实现的请求的方式。 另外,还可以通过在URL中添加参数的方式传递数据,以避免直接访问不同名间的数据。然而,这种方法只适用于简单的数据传输,不适用于涉及到敏感信息的内容。 总之,iframe嵌入三方网站是一个在Web开发中经常会遇到的问题解决这个问题需要综合考虑当前应用场景和技术实现方式,选用合适的解决方案
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值