8

I realize this question has been asked a dozen or more times and each response given indicates I am doing it right but perhaps I am missing something.

AJAX serves up CORS request like so...

$.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 serves up CORS requests like so...

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");

According to all documentation as long as the 'Access-Control-Allow-Credentials' server side header, and the 'withCredentials=true' client side header is set session cookie handling between the domains should be transparent. Am I missing something?

4

2 回答 2

4
async: false

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

async: true

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

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

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

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

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

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

有人对此有任何想法吗?

于 2012-11-19T20:46:47.977 回答
1

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

于 2012-11-19T16:34:46.413 回答