CORS $.ajax会话cookies(access-control-allow-credentials和withCredentials = true)

8

我知道这个问题已经被问了十几次,每一个答案都表明我做得很正确,但也许我还是漏掉了什么。

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处理应该是透明的。我有遗漏什么吗?

你漏了问题中的浏览器名称和jQuery版本...还可以查看https://dev59.com/A3I-5IYBdhLWcg3wBjdR - Alexei Levenkov
jQuery v1.8.3&Mozilla Firefox&Google Chrome正如您在上面的代码中所看到的,我实际上正在设置该标志。 - jas-
2个回答

4
async: false

以下修复了问题,确保会话 cookie 每次请求时发送回服务器。
async: true

尽管这样做允许会话cookie在进行跨源请求共享调用时由浏览器设置,但我现在遇到了以下情况的问题:
服务器A向客户端发送响应 客户端使用CORS请求服务器B
XMLHttpRequest -> PHP -> Session handler -> MySQL -> Stored Procedure 

由于PHP会话管理中的MUTEX锁定以及异步性和明显的要求,可能需要通过手动设置带有不同标头选项(例如XCookie或类似选项)的cookie来保持服务器会话和客户端请求同步。然而,我个人认为这种方法存在易受会话劫持和会话重放攻击的风险,因此并不理想。
使用SSL/TLS包装的连接可以防止上述情况发生,但就客户端独立提供安全措施而言,我认为这还不够。
对此有何想法?

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

我最初也考虑过这个,但即使启用了通配符(这违反了@https://developer.mozilla.org/en-US/docs/HTTP_access_control中指出的一切,该文档指出只要客户端和服务器都将“withCredentials”选项设置为“true”,并且“access-method-allow-origin”设置为预检cors请求中指定的源标头值,请求应在两个域之间设置并发送cookie。 - jas-
哦,非常抱歉,你说得很对:*不能与凭据一起使用。但是,也许你可以更新你的示例以增加清晰度;在客户端和服务器代码中都看到“someotherdomain”字符串会让人感到困惑。 - monsur
此外,根据https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet的说法,这实际上是一种“不良实践”的CORS实现。 - jas-
CORS是生命的障碍。它实际上创造了更多的问题,而不是解决问题。 - Alfonso Nishikawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接