gpt4 book ai didi

Javascript 提取不发送 Cookie header (CORS)

转载 作者:行者123 更新时间:2023-12-02 18:23:08 24 4
gpt4 key购买 nike

我正在尝试在 javascript 提取 CORS 请求中将 Cookie 发送到 PHP 脚本。请求从 https://sub1.example.com 开始,包含以下选项:

let response = await fetch('https://sub2.example.com/target.php', {
method: "POST",
headers: headers,
body: formData,
mode: 'cors',
credentials: 'include',
cache: 'no-store'
});

相应的 PHP Script 设置了以下 Headers:

header('Access-Control-Allow-Origin: https://www.example.com');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With, Set-Cookie, Cookie, Bearer');

但是 Cookie header 没有随请求一起发送。我也试过:

let headers = new Headers();
headers.set('Cookie', document.cookie);

那也没有效果。我到底做错了什么?

我检查了开发工具中的网络选项卡。 PHP 脚本中的 $_COOKIE 也是空的。绝对没有错误。我还可以看到 Cookie header 是在任何非 CORS fetch 请求中发送的。

编辑:这是其中一个 Cookie 的设置:

Name: PHPSESSID
Path: /
Secure: true
SameSite: none

我无法共享域,因为它不是公开的。但是 Cookie 域与请求 header 中的来源具有相同的值(减去 https://)。

编辑 2:更改了获取 URL 以使发生的事情更清楚。

最佳答案

问题

请注意,取决于

  • cookie 的 Path 属性的值,
  • cookie 的 Domain 属性的有效值,
  • cookie 的Secure 属性的值,
  • cookie 的有效值 SameSite attribute ,
  • 请求的发出和目标来源,

cookie 可能附加也可能不附加到请求中。与您的案例特别相关的是 Domain 属性;查看MDN's page on the topic :

The Domain attribute specifies which hosts can receive a cookie. If unspecified, the attribute defaults to the same host that set the cookie, excluding subdomains. If Domain is specified, then subdomains are always included. Therefore, specifying Domain is less restrictive than omitting it. However, it can be helpful when subdomains need to share information about a user.

您在源 https://sub1.example.com 上按如下方式设置 cookie:

Set-Cookie: PHPSESSID=whatever; Path=/; SameSite=None; Secure

因此,该 cookie 将附加到目标来源为 https://sub1.example.com 而不是其他来源的(已认证)请求。

解决方案

如果您希望将您的 cookie 发送到域为 example.com 子域的所有安全来源,您需要将其 Domain 显式设置为 example .com.


关于使用 fetch 发送 cookies

Fetch standard指定 forbidden header names 的列表; Cookie 就是其中之一。您不能在使用 fetch 发送的请求上设置名为 Cookie 的 header ;标准简单forbids it .如果要将现有 cookie 附加到跨源请求,请使用 'include' value for the credentials parameter传入 fetch 选项。

关于Javascript 提取不发送 Cookie header (CORS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70590447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com