【问题标题】:Using CORS to access HTTP Cookies使用 CORS 访问 HTTP Cookie
【发布时间】:2020-12-14 04:01:44
【问题描述】:

我有一个用户在域 A。当他们向域 A 发出请求时,我希望域 A 与域 B 联系。一旦请求到达域 B,我希望域 B 访问用户的 HTTP Cookie 在域 B 上而不在域 A 上。这可能与 CORS 相关吗?

所以重新散列。

  1. 用户访问www.example.com
  2. 一个跨域请求来自www.example.com -> www.example.net
  3. www.example.net 检查 HTTP Cookies ON www.example.net 而不是 www.example.com 的请求用户。

显然开箱即用是行不通的。我正在寻找可行的安全解决方案。

这里的想法是我同时拥有www.example.comwww.example.net,并且我想在用户访问www.example.com 时登录到www.example.net 数据库,前提是他们在www.example.net 上设置了特定的HTTP Cookie。

更新

我在测试服务器端脚本上设置了 CORS(www.example.net 用于本示例):

<?PHP       
    header("Access-Control-Allow-Origin: https://www.example.com");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 60');    
    
    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            // may also be using PUT, PATCH, HEAD etc
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
        
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    
        exit(0);
    }
    
    echo "Cookie Dump: \n";
    echo print_r($_COOKIE);

而在客户端www.example.com 上,我只是使用fetch API:

<script>
  fetch("https://badge-dev.myfreecams.com/codex/auth.php", {
     method: 'GET',
     credentials: 'include'
   }).then(data => console.log(data));
</script>

没有任何 CORS 错误。如果我直接在浏览器中访问服务器端脚本,我会看到客户端 HTTP Cookie 的正确转储。但是,当 www.example.com 被加载时,它们不会被转储。这意味着我无法在我的服务器 www.example.net 上做我需要做的事情,因为 $_COOKIE 数组是空的。

【问题讨论】:

  • 你试过 iframe 吗?
  • example.com 中生成一个动态 iframe,其中包含 src 到 example.net 并附加到正文中,然后您可以访问 example.net cookie
  • @Lessmore 我需要更多信息才能对此进行测试。
  • 尝试阅读有关 Access-Control-Allow-Origin 的信息:* dev.to/lydiahallie/cs-visualized-cors-5b8h 我们在我们的服务器 nginx(或 apache)上进行了此配置
  • 您尝试过我的解决方案(iframe)吗?

标签: javascript php http cookies cors


【解决方案1】:

example.com 中,我们有一个带有 iframe 的页面,该页面从 example.net 加载页面。

index.html:

<!DOCTYPE html>
<html lang="en">
<body>
<iframe src="http://example.net/log.php"></iframe>
</body>
</html>

example.net 中,我们有一个.php 文件用于读取和写入cookie(或您想通过cookie 执行的任何操作):

<?php
$visits = isset($_COOKIE['visits']) ? intval($_COOKIE['visits']) : 0;
var_dump($_COOKIE);
$visits += 1;
setcookie('visits', $visits, time() + 3600);

一些注意事项:

在我的开发环境(Win10、Chrome 87)中,Chrome 避免跨站点 cookie。 Chrome 80+ 在 set-cookie 中添加了一个新属性,称为SameSite,用于改善隐私。 For more info read this - SameSite

在您的情况下,此选项需要为 None,例如 SameSite=None,并且您的域必须为 https

简而言之,您的设置 cookie 命令应该有 ... Secure; SameSite=None 例如:

header("Set-Cookie: key=value; path=/; domain=example.net; Secure; SameSite=None");

在我的开发环境中我没有 https 域,所以我为我的测试禁用了 chrome SameSite Turning off Google Chrome SameSite Cookie Enforcement

【讨论】:

    【解决方案2】:

    如果您在跨域请求上设置了the credentials option,则将包含用于发出请求的 URL 的 cookie。但是,这将在设置包含凭据的请求之前触发preflight OPTIONS request

    fetch("//example.net/", {
        method: 'GET',
        credentials: 'include'
    });
    

    【讨论】:

    • 我认为这也可以,但是当我在服务器上转储 Cookie 时,它​​没有显示任何内容。如果我直接访问服务器端脚本,Cookie 就在那里。没有 CORS 错误。
    猜你喜欢
    • 2020-10-14
    • 2020-08-10
    • 2020-09-08
    • 1970-01-01
    • 2020-02-11
    • 2016-11-30
    • 2020-12-06
    • 2017-12-11
    • 2014-02-26
    相关资源
    最近更新 更多