当页面包含在 IFRAME 中时,浏览器不会在 HTTP POST 中发送该页面的 cookie

问题描述 投票:0回答:1

场景:为了响应不安全(HTTP,而不是 HTTPS)请求,Web 服务器发送域 xxx.com 的页面,其中包含一个 IFRAME,其内容是域 yyy.com 的不安全(HTTP)页面(即

<IFRAME src="http://yyy.com/blah
>) 包含一个 POST-submittable 表单 (
<FORM method=post>
)。随着响应,服务器为两个页面发送一个 cookie(xxx.com 和 yyy.com 的
Set-Cookie
),两个
Set-Cookie
标头都包含
SameSite=none
attibute.

但是,当从 IFRAME 页面中提交表单时,对服务器的 HTTP POST 请求不包含发送到 yyy.com 的 cookie(通过检查浏览器和 Web 服务器之间的流量来验证)。

此行为在 Firefox 和 Chrome 上都很明显,因此似乎是浏览器标准。

我很困惑;我认为 Web 服务器发送的

SameSite=none
属性应该向浏览器表明,每当浏览器对该源页面的 URL 发出 GET 或 POST 请求时,它必须发送属于 IFRAME 源页面的 cookie(无论该请求中的
referrer
行是否具有相同的 URL 或另一个域的 URL)。

所以我需要解释为什么这不起作用,如果有原因,如何解决问题。谢谢

预期:属于 IFRAME 的 src 页面的 cookie 与来自该页面的 POST 请求(表单提交)一起发送

google-chrome iframe browser session-cookies samesite
1个回答
0
投票

您遇到的行为是预期的,是 cookie 中的 SameSite 属性和浏览器对跨站点请求的默认行为的结果。

当一个 cookie 的 SameSite 属性设置为“无”时,这意味着该 cookie 可以在跨站点请求中发送。但是,跨站点 POST 请求还有一个额外的要求。在现代浏览器中,当从 iframe 发出跨站点 POST 请求时,浏览器不会在请求中包含 cookie,除非 SameSite 属性设置为“None”并且 Secure 属性也存在。这意味着即使您设置了 SameSite=none,cookie 也不会与来自 iframe 的 POST 请求一起发送,因为它不是通过 HTTPS 提供的。

要解决此问题,您需要确保父页面 (xxx.com) 和 iframe 页面 (yyy.com) 均通过 HTTPS 提供服务。这意味着应该使用“https://”URL 而不是“http://”来访问这些页面。通过 HTTPS 同时提供父页面和 iframe 页面,浏览器将在 POST 请求中包含 cookie。

综上所述,要实现预期的行为:

  1. 通过 HTTPS 提供父页面 (xxx.com) 和 iframe 页面 (yyy.com)。
  2. 将 cookie 的 SameSite 属性设置为“None”并包含 Secure 属性。

按照这些步骤,浏览器应按预期在来自 iframe 页面的 POST 请求中包含 cookie。

© www.soinside.com 2019 - 2024. All rights reserved.