2012-11-19 7 views
8

Mi rendo conto che questa domanda è stata fatta una dozzina o più volte e ogni risposta data indica che sto facendo bene ma forse mi manca qualcosa .

AJAX serve CORS richiesta in questo modo ...

$.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 serve CORS domande come così ...

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

Secondo tutta la documentazione fino a quando il 'Ingressi Controllo -L'intestazione lato server'Allow-Credentials 'e l'intestazione lato client' withCredentials = true 'sono impostate La gestione dei cookie di sessione tra i domini dovrebbe essere trasparente. Mi sto perdendo qualcosa?

+0

Risposta :) - Mancano il nome del browser e la versione jQuery dalla domanda ... Controlla anche http://stackoverflow.com/questions/2054316/jquery-sending-credentials-with-cross-domain-posts –

+0

jQuery v1.8.3 e Mozilla Firefox e Google Chrome In realtà sto impostando quella bandiera come si può vedere nel codice sopra –

risposta

4
async: false 

impediva che il cookie di sessione venisse restituito al server in ogni richiesta. Il seguente risolto.

async: true 

Anche se questo non consentire il cookie di sessione per ottenere impostato dal browser quando si effettua una chiamata di condivisione richiesta di origine croce, ora sto vivendo problemi per quanto riguarda il seguente scenario:

Server A invia risposta al cliente client utilizzando CORS fa richiesta di server B

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

a causa dei blocchi mutex nella gestione delle sessioni PHP della natura asincrona e apparentemente, requisito può forzare un lavoro in giro di s manualmente etting il cookie con un'opzione di intestazione diversa come XCookie o qualcosa di simile per mantenere sincronizzate le richieste di server e client.

Questo particolare lavoro non mi sta bene perché credo che aprirebbe una facile corsia di marcia per i dirottamenti di sessione e i vettori di attacco a ripetizione di sessioni.

L'utilizzo di una connessione SSL/TLS integrata può aiutare a prevenire lo scenario di cui sopra ma in termini di misure di sicurezza indipendenti per il client, non credo che questo dovrebbe essere sufficiente.

Chiunque abbia qualche idea su questo?

1

Nel tuo esempio sopra, stai impostando l'intestazione Access-Control-Allow-Origin su 'http://someotherdomain.com', che è la stessa dell'URL che stai richiedendo da JQuery. L'intestazione Access-Control-Allow-Origin dovrebbe essere il valore del dominio da cui proviene la richiesta. Come test rapido, prova a impostare il valore di questa intestazione su "*" (senza virgolette) e controlla se funziona ("*" significa che tutti i domini sono consentiti).

+0

Ci ho pensato prima, ma anche con il jolly abilitato (che va contro tutto ciò che è stato notato @https: // developer.mozilla.org/en-US/docs/HTTP_access_control che indica che finché client e server impostano entrambi l'opzione 'withCredentials' su 'true' e 'access-method-allow-origin' è impostato sull'intestazione di origine valore specificato nella richiesta pre-volo che la richiesta deve impostare e inviare i cookie tra i due domini. –

+0

Oh mi dispiace, hai ragione: * non può essere utilizzato con le credenziali. Tuttavia, forse puoi aggiornare il tuo esempio per chiarezza; è confuso vedere la stringa "someotherdomain" sia nel codice client che nel codice server. – monsur

+0

Inoltre, questa è in realtà un'implementazione CORS "cattiva pratica" in base a https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet –

Problemi correlati