我知道这个问题已经被问了十二遍或更多遍了,给出的每一个回答都表明我做对了,但也许我遗漏了一些东西。
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
由于PHP会话管理中的MUTEX锁具有异步特性,因此显然需要强制使用其他标头选项(例如XCookie)或类似方法来手动设置cookie,以保持服务器会话和客户端请求同步。
这种特殊的解决方法不太适合我,因为我相信它将为会话劫持和会话重播攻击媒介开辟一条轻松的通道。
使用SSL / TLS包装的连接可能有助于防止上述情况,但是就为客户端独立提供安全措施而言,我认为这不足够。
有人对此有任何想法吗?