首页 > 编程知识 正文

iframe跨域写cookie,iframe嵌套不支持cookie

时间:2023-05-04 07:19:20 阅读:27429 作者:953

问题现象:

系统上的常规iframe嵌套了其他域名网站的页面,最初可以正常显示chrome的低版本浏览器和360浏览器、火狐浏览器嵌套的页面,然后显示当前的iframe页面

最近升级了chrome浏览器的新版后,iframe页面不再显示。 页面无误,查看请求url标头信息Response Headers:

连接: keep-alive

内容长度:0

Date:Tue,02 Mar 2021 02:50:11 GMT

Keep-Alive:timeout=20

会话状态: time out

set-cookie : jsessionid=12d 38d 20-247 B- 447 e-ad C4-1413055 ea33d; Path=/; 只有http

原因还原:

1、在单独窗口中访问嵌套页面的url,一切正常(页面显示正常,页面请求正常获取cookie信息),排除iframe页面问题。

2、进一步尝试,将此链接iframe放入全新的html文件无法正常访问,消除了当前系统的iframe加载问题。

3、新制作的html文件在火狐浏览器中打开即可正常访问。

4、新的chrome浏览器进入,iframe页面显示空白。 (测试机chrome浏览器版本88.0.4324.150 )正式版本(64位) ) ) ) ) ) ) ) )

初步结论:较新版本的chrome浏览器受到限制,iframe页面无法访问第三方cookie,嵌套此页面的站点无法在iframe页面上共享cookie。

深入分析:

使用其他浏览器(firefox,ie )时,会话也是一致的。

比较chrome和firefox的请求标头和响应标头:

firefox :在首次启动请求后,服务端返回会话id,然后为请求中的每个cookie带来会话id。

chrome :由于请求标头始终没有sessionId,且整个cookie为空,因此服务每次都无法接受sessionId,每次都重新分配session。

问题分析:

谷歌在2020年2月4日发布的Chrome 80版本(schedule:https://www.chrome status.com/features/schedule ) )中提供了所有第三方Cookie

也就是说,默认情况下,所有Cookie都加上SameSite=Lax属性(https://www.chrome status.com/feature/5088147346030592 ),而非secure cookie为sare

SameSite的作用是通过防止在域之间发送cookie来防止CSRF攻击和用户跟踪。 这是为了从源中屏蔽CSRF漏洞。 关于SameSite属性的介绍《Cookie 的 SameSite 属性》。

Cookie的SameSite属性用于限制第三方Cookie以降低安全风险。

可以设置三个值。

严格严格严格严格限制是最严格的,完全禁止第三方Cookie,不会在站点之间发送Cookie。 也就是说,只有当前网页的URL与请求方匹配时,才会带上Cookie。

set-cookie : cookiename=cookie value; samesite=严格; 这个规则太严格了,可能会成为非常差的用户体验。 例如,当前网页包含GitHub链接,当用户单击跳转时,github cookie不可用,即使跳转也始终处于未登录状态。

Lax Lax的规则略有放宽,除了对目标站点的Get请求外,通常不会发送第三方Cookie。

set-cookie : cookiename=cookie value; SameSite=Lax; 仅在三种情况下(链接、预加载请求和获取表单),导航到目标站点的获取请求。 详情请参阅下表。

请求类型示例通常Lax链路a href='.'/a发送Cookie发送Cookie预载链路link rel='prerender' href='.'/发送cookie cookie get表单form method=' get ' action=' . '发送CookiePOST表单form method=' post ' action=' . ' cookie 不发送get (' . ' ) cookie设置image img src=' . '不发送cookie设置严格或Lax后,CSRF攻击几乎为零。 当然,前提是用户浏览器支持SameSite属性。

None Chrome计划将Lax设置为默认设置。 在这种情况下,站点可以显式关闭SameSite属性并将其设置为None。 但是,必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。

以下设置无效:

set-cookie:小部件_session=ABC123; SameSite=None下的设定有效。

set-cookie:小部件_session=ABC123; SameSite=None; 安全

上述问题中,在当前系统访问第三方系统时,带了一些cookie过去,然后被这个SameSite机制拦截掉了。

Chrome 80可能受影响的场景如下

1、组件数据基于第三方网站登录状态返回相关用户数据的API请求

2、HTTP本地部署

解决方案

Chrome浏览器打开新选项卡,并在地址栏中分别输入

chrome ://flags//same-site-by-default-cookies

chrome ://flags//# cookies-without-same-site-must-be-secure

然后,如上图所示,将两种配置都设置为Disabled (此策略不推荐,可用于应急系统访问)

开发建议:

1 .禁用浏览器的samsite属性/降低版本(当前仅存在chorme ) ) ) ) ) ) ) )。

2 .保证同源策略cookie的共享(始终保证ip或域名) ) ) )。

3.response.setheader (“set-cookie”、“HttpOnly; 安全; SameSite=None " ),需要设置https证书

不使用cookie共享会话,而是通过token实现

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。