CORS $.ajax 会话 cookie(访问控制允许凭据和 withCredentials=true)

Posted

技术标签:

【中文标题】CORS $.ajax 会话 cookie(访问控制允许凭据和 withCredentials=true)【英文标题】:CORS $.ajax session cookies (access-control-allow-credentials & withCredentials=true) 【发布时间】:2012-11-07 14:37:25 【问题描述】:

我意识到这个问题已经被问了十几次,每个回答都表明我做得对,但也许我错过了一些东西。

AJAX 像这样提供 CORS 请求...

$.ajax(
url: 'someotherdomain.com',
type: 'post',
data: key: 'value',
dataType: 'json',
async: false,
crossDomain: true,
beforeSend: function(xhr)
    xhr.withCredentials = true;
,
success: function(x, status, xhr)

,
error: function(xhr, status, error)


);

php 像这样提供 CORS 请求...

header('Access-Control-Max-Age: 1728000');
header('Access-Control-Allow-Origin: http://someotherdomain.com');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Content-MD5, X-Alt-Referer');
header('Access-Control-Allow-Credentials: true');
header("Content-Type: application/json; charset=utf-8");

根据所有文档,只要设置了“Access-Control-Allow-Credentials”服务器端标头和“withCredentials=true”客户端标头,域之间的会话 cookie 处理应该是透明的。我错过了什么吗?

【问题讨论】:

Answer :) - 您在问题中缺少浏览器名称和 jQuery 版本...另请查看 ***.com/questions/2054316/… jQuery v1.8.3 & Mozilla Firefox & Google Chrome 我实际上是在设置那个标志,正如你在上面的代码中看到的那样 【参考方案1】:
async: false

阻止会话 cookie 在每次请求时被发送回服务器。以下修复了它。

async: true

虽然这确实允许在进行跨源请求共享调用时由浏览器设置会话 cookie,但我现在遇到以下情况的问题:

服务器 A 向客户端发送响应 使用 CORS 的客户端向服务器 B 发出请求

XMLHttpRequest -> PHP -> Session handler -> mysql -> Stored Procedure 

由于 MUTEX 锁定 PHP 会话管理中的异步特性,显然,要求可能会强制使用不同的标头选项(例如 XCookie 或类似的东西)手动设置 cookie,以保持服务器会话和客户端请求同步.

这种特殊的解决方法并不适合我,因为我相信它会为会话劫持和会话重放攻击向量开辟一条轻松的通道。

使用 SSL/TLS 包装的连接可能有助于防止上述情况,但就为客户端独立提供安全措施而言,我认为这还不够。

有人对此有任何想法吗?

【讨论】:

【参考方案2】:

在上面的示例中,您将 Access-Control-Allow-Origin 标头设置为“http://someotherdomain.com”,这与您从 JQuery 请求的 url 相同。 Access-Control-Allow-Origin 标头应该是请求来自的域的值。作为一个快速测试,尝试将此标头的值设置为“*”(不带引号)并查看它是否有效(“*”表示允许所有域)。

【讨论】:

我首先想到了这一点,但即使启用了通配符(这与@developer.mozilla.org/en-US/docs/HTTP_access_control 指出的所有内容相违背,表明只要客户端和服务器都将'withCredentials'选项设置为'true'并且 'access-method-allow-origin' 设置为在飞行前 cors 请求中指定的原始标头值,该请求应设置并在两个域之间发送 cookie。 哦,很抱歉,您说的很对:* 不能与凭据一起使用。但是,为了清楚起见,也许您可​​以更新您的示例;在客户端和服务器代码中看到“someotherdomain”字符串令人困惑。 此外,根据owasp.org/index.php/html5_Security_Cheat_Sheet,这实际上是一个“不好的做法”CORS 实现 CORS 是生活的障碍。它实际上创造的问题比解决的问题更多。

以上是关于CORS $.ajax 会话 cookie(访问控制允许凭据和 withCredentials=true)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Vue Axios (CORS) 发送/存储会话 cookie 时出现问题

CORS - 服务器端 cookie 未保存在 chrome 浏览器上

Firefox 未设置通过 XHR CORS 请求接收的 Cookie

带有会话/cookie 的 CORS 请求

IIS ajax CORS 访问发送自定义Header时分析

Angular.js 的 Node.js CORS 会话 cookie