CORS $.ajax session cookie (access-control-allow-credentials & withCredentials=true)



我意识到这个问题已经被问了十几次,每次回答都表明我做得对,但可能我遗漏了什么。

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处理就应该是透明的。我是不是错过了什么?

async: false

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

async: true

尽管这确实允许浏览器在进行跨源请求共享调用时设置会话cookie,但我现在遇到了以下场景的问题:

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

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

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

这种特殊的解决方案让我不太满意,因为我相信它会为会话劫持和会话重播攻击向量开辟一条简单的通道。

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

有人对此有什么想法吗?

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

最新更新