相关文章推荐
含蓄的汽水  ·  android ...·  1 年前    · 
千杯不醉的上铺  ·  Node ...·  2 年前    · 
首发于 CEF

iframe、SameSite与CEF

iframe、SameSite与CEF

背景

本人使用CEF(或是Chrome)来加载开发的前端页面,其中使用iframe嵌入了第三方页面,在第三方页面中需要发送cookie到后端,然而加载会报错,第三方页面后端无法接受到Cookie。

原因

由于CEF(Chrome内核)的安全策略,在51版本以前、80版本以后,绝大多数情况下是禁止嵌入的iframe提交Cookie的(下文会列出哪些禁止),所以需要浏览器配置策略来允许iframe提交Cookie,这个策略就是SameSite。

SameSite 属性可以让 Cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)。 SameSite 可以有下面三种值:

  • Strict (严格的)。仅允许一方请求携带 Cookie,即浏览器将只发送相同站点请求的 Cookie,即当前网页 URL 与请求目标 URL 完全一致。
  • Lax (松懈的)。允许部分第三方请求携带 Cookie。下面是具体的情况,参考自 阮一峰博客
请求类型 示例 正常情况 Lax
链接 <a href="..."> 发送 发送
预加载 <link rel="prerender" href="..."/> 发送 发送
GET 表单 <form method="GET" action="..."> 发送 发送
POST 表单 <form method="POST" action="..."> 发送 不发送
iframe <iframe src="..."></iframe> 发送 不发送
AJAX $.get("...") 发送 不发送
Image <img src="..."> 发送 不发送
  • None (无)。无论是否跨站都会发送 Cookie。

解决方案

Chrome(或是基于Chromium的Edge)

在基于Chrome中,可以进入如下的页面进行配置:

  • 地址栏输入: chrome://flags/ (Edge中会自动转为 edge://
  • 找到 SameSite by default cookies Cookies without SameSite must be secure
  • 将上面两项设置为 Disable

CEF

上面的方法很通用,不过,对于CEF项目来说,并没有这个页面供我们配置。我们可以通过命令行形式传入:

cef-app.exe(你的cef应用程序) --disable-features=SameSiteByDefaultCookies

参考

ruanyifeng.com/blog/201

发布于 2021-03-08 19:04

文章被以下专栏收录