Según tengo entendido, si una secuencia de comandos del lado del cliente que se ejecuta en una página de foo.com quiere solicitar datos de bar.com, en la solicitud debe especificar el encabezado Origin: http://foo.com
, y la barra debe responder Access-Control-Allow-Origin: http://foo.com
.
¿Qué hay para evitar que el código malicioso del sitio roh.com simplemente falsifique el encabezado Origin: http://foo.com
para solicitar páginas de la barra?
javascript
ajax
http
cors
Jay Lamont
fuente
fuente
foo.com
) tiene que proporcionar elAccess-Control-Allow-Origin
encabezado o el navegador no permite la solicitudbar.com
.Respuestas:
Los navegadores controlan la configuración del
Origin
encabezado y los usuarios no pueden anular este valor. Por lo tanto, no verá elOrigin
encabezado falsificado de un navegador. Un usuario malintencionado podría elaborar una solicitud curl que establezca manualmente elOrigin
encabezado, pero esta solicitud vendría desde fuera de un navegador y es posible que no tenga información específica del navegador (como las cookies).Recuerde: CORS no es seguridad. No confíe en CORS para asegurar su sitio. Si está sirviendo datos protegidos, use cookies o tokens OAuth o algo más que el
Origin
encabezado para proteger esos datos. ElAccess-Control-Allow-Origin
encabezado en CORS solo dicta qué orígenes se deben permitir hacer solicitudes de origen cruzado. No confíes en eso para nada más.fuente
TLDR: no hay nada que impida que el código malicioso falsifique el origen. Cuando eso suceda, su servidor nunca lo sabrá y actuará según las solicitudes. A veces esas solicitudes son caras. Por lo tanto, no use CORS en lugar de ningún tipo de seguridad.
He estado jugando con CORS recientemente, y me he hecho la misma pregunta. Lo que he encontrado es que el navegador puede ser lo suficientemente inteligente como para conocer una solicitud CORS falsa cuando la ve, pero su servidor no es tan inteligente.
Lo primero que encontré fue que el
Origin
encabezado es un nombre de encabezado prohibido HTTP que no se puede modificar mediante programación. Lo que significa que puede modificarlo en aproximadamente 8 segundos usando Modificar encabezados para Google Chrome .Para probar esto, configuré dos dominios de Cliente y un dominio de Servidor. Incluí una lista blanca CORS en el Servidor, que permitía las solicitudes CORS del Cliente 1 pero no del Cliente 2. Probé a ambos clientes, y de hecho las solicitudes CORS del Cliente 1 tuvieron éxito mientras que el Cliente 2 falló.
Luego falsifiqué el
Origin
encabezado del Cliente 2 para que coincida con el del Cliente 1. El servidor recibió elOrigin
encabezado falsificado y superó con éxito la verificación de la lista blanca (o falló si eres un tipo medio vacío). Después de eso, el Servidor se desempeñó debidamente al consumir todos los recursos para los que fue diseñado (llamadas a la base de datos, envío de correos electrónicos caros, envío de mensajes SMS aún más caros, etc.). Cuando se hizo eso, el servidor felizmente envió elAccess-Control-Allow-Origin
encabezado falso al navegador.La documentación que he leído indica que el
Access-Control-Allow-Origin
valor recibido debe coincidirOrigin
exactamente con el valor enviado en la solicitud. Coincidieron, así que me sorprendió cuando vi el siguiente mensaje en Chrome:La documentación que leí no parece ser precisa. La pestaña de red de Chrome muestra claramente los encabezados de solicitud y respuesta
http://client1.dev
, pero puede ver en el error que Chrome de alguna manera sabe que el origen real erahttp://client2.dev
y rechaza correctamente la respuesta. Lo que no importa en este momento porque el servidor ya había aceptado la solicitud falsificada y había gastado mi dinero.fuente
There's nothing stopping malicious code from spoofing the origin
-> Sí, javascript no se puede configurarOrigin
. Sí, un usuario puede modificar su navegador / usar el violinista para cambiar el origen, pero eso no es lo que CORS defiende; los sitios web controlados por atacantes no pueden cambiar Origin, que es lo único que importa.Solo una humilde conclusión:
P: ¿La misma política de origen (SOP) se aplica solo por los navegadores?
A: si. Para todas las llamadas que realice dentro de un navegador, el navegador definitivamente aplica el SOP. El servidor puede o no verificar el origen de la solicitud.
P: Si una solicitud no cumple con SOP, ¿el navegador la bloquea?
R: No, está más allá de la autoridad de los navegadores. Los navegadores solo envían solicitudes de origen cruzado y esperan la respuesta para ver si el servidor señala la llamada legítima a través de
Access-Control
* encabezados. Si el servidor no devuelve elAccess-Control-Allow-Origin
encabezado, no hace eco del origen de la persona que llama o no devuelve*
el encabezado, entonces todo lo que hará un navegador es abstenerse de proporcionar la respuesta a la persona que llama.P: ¿Significa que no puedo engañar
Origin
?R: En el navegador y al usar secuencias de comandos, no puede anular
Origin
ya que está bajo el control del navegador. Sin embargo, si desea piratearse, puede manipular las llamadas que salen de SU navegador utilizando extensiones de navegador u otras herramientas que instale en su máquina. También puede emitirHTTP
llamadas usandocurl
,Python
,C#
, etc, y alterar laOrigin
cabecera a los servidores de truco.P: Entonces, si puedo engañar al servidor alterando
Origin
, ¿significaCORS
que no es seguro?R:
CORS
per se no dice nada sobre seguridad, es decir, autenticación y autorización de solicitudes. Depende de los servidores inspeccionar las solicitudes y autenticarlas / autorizarlas mediante cualquier mecanismo con el que trabajen, como cookies y encabezados. Dicho esto, puede protegernos un poco más en caso de ataques como XSS:Ejemplo: supongamos que ha iniciado sesión en su sitio web y un script malintencionado intenta enviar una solicitud al sitio web de su banco para consultar su saldo: un ataque XSS reflejado . El sitio web de su banco confía en las credenciales que provienen (aquí en nombre de) su sitio web para que la solicitud se autentique y
HTTP
se emita una respuesta que apunte al código malicioso. Si el sitio web de su banco no se preocupa por compartir sus puntos finales con otros orígenes, no incluyeAccess-Control-Allow-Origin
encabezado en la respuesta. Ahora, al llegar la solicitud, el navegador se da cuenta de que la solicitud era una solicitud Cross Origins, pero la respuesta no muestra que el servidor estaba feliz de compartir el recurso (aquí el punto final de consulta de saldo) con su sitio web. Por lo tanto, rompe el flujo, por lo tanto, el resultado devuelto nunca alcanzará el código malicioso.fuente