我意识到这个问题已经被问过十几次了,每个回答都表明我做得对,但也许我错过了一些东西.
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,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包装的连接可能有助于防止上述情况,但就为客户端独立提供安全措施而言,我认为这不足以满足要求.
对此有何想法的人?