Tengo un proceso Grunt que inicia una instancia del servidor express.js. Esto funcionó absolutamente bien hasta ahora, cuando comenzó a mostrar una página en blanco con lo siguiente que aparece en el registro de errores en la consola del desarrollador en Chrome (última versión):
XMLHttpRequest no puede cargar https://www.example.com/ No hay un encabezado 'Access-Control-Allow-Origin' presente en el recurso solicitado. Por lo tanto, no se permite el acceso al origen ' http: // localhost: 4300 '.
¿Qué me impide acceder a la página?
tl; dr: hay un resumen al final y títulos en la respuesta para que sea más fácil encontrar las partes relevantes. Sin embargo, se recomienda leer todo, ya que proporciona antecedentes útiles para comprender el por qué, lo que facilita ver cómo se aplica el cómo en diferentes circunstancias.
Esta es la Política de Mismo Origen . Es una característica de seguridad implementada por los navegadores.
Su caso particular muestra cómo se implementa para XMLHttpRequest (y obtendrá resultados idénticos si usara fetch), pero también se aplica a otras cosas (como imágenes cargadas en un <canvas>
o documentos cargados en un <iframe>
), solo con implementaciones ligeramente diferentes.
(Extrañamente, también se aplica a las fuentes CSS, pero eso se debe a que las fundiciones encontradas insistieron en DRM y no por los problemas de seguridad que generalmente cubre la Política del Mismo Origen).
El escenario estándar que demuestra la necesidad del POE se puede demostrar con tres caracteres :
https://www.[website].com/
en tu ejemplo)http://localhost:4300
en su ejemplo)Alice ha iniciado sesión en el sitio de Bob y tiene algunos datos confidenciales allí. Quizás sea una intranet de la empresa (accesible solo para navegadores en la LAN), o su banca en línea (accesible solo con una cookie que obtiene después de ingresar un nombre de usuario y contraseña).
Alice visita el sitio web de Mallory, que tiene algo de JavaScript que hace que el navegador de Alice realice una solicitud HTTP al sitio web de Bob (desde su dirección IP con sus cookies, etc.). Esto podría ser tan simple como usar XMLHttpRequest
y leer responseText
.
La Política del mismo origen del navegador evita que JavaScript lea los datos devueltos por el sitio web de Bob (al que Bob y Alice no quieren que Mallory acceda). (Tenga en cuenta que puede, por ejemplo, mostrar una imagen usando un <img>
elemento través orígenes debido a que el contenido de la imagen no está expuesto a JavaScript (o Mallory) ... a menos que tirar de la lona en la mezcla, en cuyo caso se va a generar un mismo origen error de infracción).
Para cualquier URL dada, es posible que el SOP no sea necesario. Un par de escenarios comunes donde este es el caso son:
… Pero el navegador no tiene forma de saber si alguno de los anteriores es cierto, por lo que la confianza no es automática y se aplica el SOP. El permiso debe otorgarse explícitamente antes de que el navegador proporcione los datos que se le dieron a un sitio web diferente.
Las extensiones del navegador *
, la pestaña Red en las herramientas de desarrollo del navegador y aplicaciones como Postman son software instalado. No pasan datos de un sitio web al JavaScript que pertenece a un sitio web diferente solo porque usted visitó ese sitio web diferente . La instalación de software generalmente requiere una elección más consciente.
No hay un tercero (Mallory) que se considere un riesgo.
*
Las extensiones del navegador deben escribirse con cuidado para evitar problemas de origen cruzado. Consulte la documentación de Chrome, por ejemplo .
Hay una serie de circunstancias en las que el sitio de Mallory puede hacer que un navegador obtenga datos de un tercero y los muestre (por ejemplo, agregando un <img>
elemento para mostrar una imagen). Sin embargo, no es posible que el JavaScript de Mallory lea los datos en ese recurso, solo el navegador de Alice y el servidor de Bob pueden hacerlo, por lo que aún es seguro.
El encabezado de respuestaAccess-Control-Allow-Origin
HTTP al que se hace referencia en el mensaje de error es parte del estándar CORS que le permite a Bob otorgar explícitamente permiso al sitio de Mallory para acceder a los datos a través del navegador de Alice.
Una implementación básica solo incluiría:
Access-Control-Allow-Origin: *
… En los encabezados de respuesta para permitir que cualquier sitio web lea los datos.
Access-Control-Allow-Origin: http://example.com/
... permitiría que solo un sitio específico acceda a él, y Bob puede generarlo dinámicamente en función del encabezado de la Origin
solicitud para permitir que varios sitios, pero no todos, accedan a él.
Los detalles de cómo Bob establece ese encabezado de respuesta dependen del servidor HTTP de Bob y / o del lenguaje de programación del lado del servidor. Hay una colección de guías para varias configuraciones comunes que pueden ayudar.
NB: Algunas solicitudes son complejas y envían una solicitud de OPCIONES de verificación previa a la que el servidor tendrá que responder antes de que el navegador envíe GET / POST / PUT / Cualquier solicitud que JS quiera hacer. Las implementaciones de CORS que solo se agregan Access-Control-Allow-Origin
a URL específicas a menudo se tropiezan con esto.
Obviamente, otorgar permiso a través de CORS es algo que Bob solo haría solo si:
No existe un mecanismo estándar para que Mallory agregue este encabezado porque tiene que provenir del sitio web de Bob, que ella no controla.
Si Bob está ejecutando una API pública, entonces puede haber un mecanismo para activar CORS (tal vez formateando la solicitud de cierta manera, o una opción de configuración después de iniciar sesión en un sitio del Portal de desarrolladores para el sitio de Bob). Sin embargo, este tendrá que ser un mecanismo implementado por Bob. Mallory podría leer la documentación en el sitio de Bob para ver si hay algo disponible, o podría hablar con Bob y pedirle que implemente CORS.
Algunas solicitudes de origen cruzado tienen verificación previa .
Esto sucede cuando (en términos generales) intenta realizar una solicitud de origen cruzado que:
enctype
).En estos casos, el resto de esta respuesta aún se aplica, pero también debe asegurarse de que el servidor pueda escuchar la solicitud de verificación previa (que será OPTIONS
(y no GET
, POST
o lo que sea que estaba tratando de enviar) y responder con el derecho Access-Control-Allow-Origin
header sino también Access-Control-Allow-Methods
y Access-Control-Allow-Headers
para permitir sus métodos o encabezados HTTP específicos.
A veces, las personas cometen errores al intentar construir solicitudes Ajax y, a veces, estos provocan la necesidad de una verificación previa. Si la API está diseñada para permitir solicitudes de origen cruzado, pero no requiere nada que necesite una verificación previa, esto puede interrumpir el acceso.
Los errores comunes que desencadenan esto incluyen:
Access-Control-Allow-Origin
y otros encabezados de respuesta CORS en la solicitud. Estos no pertenecen a la solicitud, no hacen nada útil (¿cuál sería el punto de un sistema de permisos en el que pudiera otorgarse permiso a sí mismo?), Y deben aparecer solo en la respuesta.Content-Type: application/json
encabezado en una solicitud GET que no tiene un cuerpo de solicitud para describir el contenido (generalmente cuando el autor confunde Content-Type
y Accept
).En cualquiera de estos casos, eliminar el encabezado de solicitud adicional a menudo será suficiente para evitar la necesidad de una verificación previa (que resolverá el problema al comunicarse con API que admiten solicitudes simples pero no solicitudes de verificación previa).
A veces es necesario realizar una solicitud HTTP, pero no es necesario leer la respuesta. por ejemplo, si está publicando un mensaje de registro en el servidor para su grabación.
Si está utilizando la fetch
API (en lugar de XMLHttpRequest
), puede configurarla para que no intente utilizar CORS.
Tenga en cuenta que esto no le permitirá hacer nada que requiera que CORS haga. No podrá leer la respuesta. No podrá realizar una solicitud que requiera una verificación previa.
Le permitirá hacer una solicitud simple, no ver la respuesta y no llenar la Consola del desarrollador con mensajes de error.
Cómo hacerlo se explica por el mensaje de error de Chrome que aparece cuando realiza una solicitud utilizando fetch
y no obtiene permiso para ver la respuesta con CORS:
La política CORS ha bloqueado el acceso a la búsqueda en '
https://example.com/
' desde el origen 'https://example.net
': No hay unAccess-Control-Allow-Origin
encabezado ' ' presente en el recurso solicitado. Si una respuesta opaca satisface sus necesidades, configure el modo de la solicitud en 'no-cors' para obtener el recurso con CORS deshabilitado.
Así:
fetch("http://example.com", { mode: "no-cors" });
Bob también podría proporcionar los datos utilizando un truco como JSONP, que es la forma en que la gente cruzó el origen de Ajax antes de que apareciera CORS.
Funciona presentando los datos en forma de un programa JavaScript que inyecta los datos en la página de Mallory.
Requiere que Mallory confíe en Bob para no proporcionar código malicioso.
Tenga en cuenta el tema común: el sitio que proporciona los datos debe decirle al navegador que está bien que un sitio de terceros acceda a los datos que está enviando al navegador.
Dado que JSONP funciona agregando un <script>
elemento para cargar los datos en forma de un programa JavaScript que llama a una función que ya está en la página, intentar usar la técnica JSONP en una URL que devuelve JSON fallará, generalmente con un error CORB, porque JSON no es JavaScript.
Si el documento HTML en el que se ejecuta JS y la URL que se solicita están en el mismo origen (compartiendo el mismo esquema, nombre de host y puerto), la Política del mismo origen otorga el permiso de forma predeterminada. CORS no es necesario.
Mallory podría usar el código del lado del servidor para obtener los datos (que luego podría pasar de su servidor al navegador de Alice a través de HTTP como de costumbre).
O bien:
Ese código del lado del servidor podría ser escrito y alojado por un tercero (como CORS Anywhere). Tenga en cuenta las implicaciones de privacidad de esto: el tercero puede monitorear quién actúa como proxy en sus servidores.
Bob no necesitaría otorgar ningún permiso para que eso suceda.
No hay implicaciones de seguridad aquí, ya que eso es solo entre Mallory y Bob. No hay forma de que Bob piense que Mallory es Alice y le proporcione a Mallory datos que deben mantenerse confidenciales entre Alice y Bob.
En consecuencia, Mallory solo puede utilizar esta técnica para leer datos públicos .
Sin embargo, tenga en cuenta que tomar contenido del sitio web de otra persona y mostrarlo por su cuenta podría ser una violación de los derechos de autor y exponerlo a acciones legales.
Como se indica en la sección "Por qué la Política del mismo origen solo se aplica a JavaScript en una página web", puede evitar el SOP si no escribe JavaScript en una página web.
Eso no significa que no pueda continuar usando JavaScript y HTML, pero podría distribuirlo usando algún otro mecanismo, como Node-WebKit o PhoneGap.
Es posible que una extensión del navegador inyecte los encabezados CORS en la respuesta antes de que se aplique la Política del mismo origen.
Estos pueden ser útiles para el desarrollo, pero no son prácticos para un sitio de producción (pedir a cada usuario de su sitio que instale una extensión de navegador que deshabilite una función de seguridad de su navegador no es razonable).
También tienden a funcionar solo con solicitudes simples (fallan al manejar solicitudes de OPCIONES de verificación previa).
Tener un entorno de desarrollo adecuado con un servidor de desarrollo local suele ser un mejor enfoque.
Tenga en cuenta que SOP / CORS no mitigan los ataques de inyección de XSS , CSRF o SQL que deben manejarse de forma independiente.
El servidor de destino debe permitir la solicitud de origen cruzado. Para permitirlo a través de Express, simplemente maneje la solicitud de opciones http:
app.options('/url...', function(req, res, next){
res.header('Access-Control-Allow-Origin', "*");
res.header('Access-Control-Allow-Methods', 'POST');
res.header("Access-Control-Allow-Headers", "accept, content-type");
res.header("Access-Control-Max-Age", "1728000");
return res.sendStatus(200);
});
Como esto no se menciona en la respuesta aceptada.
Puede hacer uso de Solicitudes simples .
Para realizar una 'Solicitud simple', la solicitud debe cumplir varias condiciones. Por ejemplo, sólo permite POST
, GET
y HEAD
método, así como permitiendo sólo algunas cabeceras dado (usted puede encontrar todas las condiciones aquí ).
Si el código de su cliente no establece explícitamente los encabezados afectados (por ejemplo, "Aceptar") con un valor fijo en la solicitud, es posible que algunos clientes establezcan estos encabezados automáticamente con algunos valores "no estándar", lo que hace que el servidor no los acepte como Solicitud simple: le dará un error CORS.
Esto sucede debido al error CORS. CORS son las siglas de Cross Origin Resource Sharing. En pocas palabras, este error se produce cuando intentamos acceder a un dominio / recurso desde otro dominio.
Lea más sobre esto aquí: error CORS con jquery
Para solucionar este problema, si tiene acceso al otro dominio, deberá permitir Access-Control-Allow-Origin en el servidor. Esto se puede agregar en los encabezados. Puede habilitar esto para todas las solicitudes / dominios o un dominio específico.
Estos enlaces pueden ayudar
Este problema de CORS no se desarrolló más (por otras causas).
Actualmente tengo este problema por diferentes motivos. Mi interfaz también está devolviendo el error de encabezado 'Access-Control-Allow-Origin'.
Solo que señalé la URL incorrecta, por lo que este encabezado no se reflejó correctamente (en lo que supongo que sí). localhost (front-end) -> llamar a http no seguro (se supone que es https), asegúrese de que el punto final de la API desde el front-end apunte al protocolo correcto.
Recibí el mismo error en la consola de Chrome.
Mi problema era que intentaba ir al sitio usando en http://
lugar de https://
. Así que no había nada que arreglar, solo tenía que ir al mismo sitio usando https
.
Este error me costó 2 días. Revisé el registro de mi servidor, la solicitud / respuesta de la opción de verificación previa entre el navegador Chrome / Edge y el servidor estaba bien. La razón principal es que la respuesta del servidor GET / POST / PUT / DELETE para XHTMLRequest también debe tener el siguiente encabezado:
access-control-allow-origin: origin
"origen" está en el encabezado de la solicitud (el navegador lo agregará a la solicitud). por ejemplo:
Origin: http://localhost:4221
puede agregar un encabezado de respuesta como el siguiente para aceptar para todos:
access-control-allow-origin: *
o encabezado de respuesta para una solicitud específica como:
access-control-allow-origin: http://localhost:4221
El mensaje en los navegadores no es claro de entender: "... El recurso solicitado"
tenga en cuenta que: CORS funciona bien para localhost. puerto diferente significa dominio diferente. si recibe un mensaje de error, verifique la configuración de CORS en el lado del servidor.
La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.
Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.
Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.
Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.
Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.
Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?
¿Quiere probar un cepillo de dientes Sonicare sin gastar mucho dinero en uno de sus modelos favoritos de gama alta? Puede comprar un kit de la Serie 2 o Serie 3 por tan solo $ 30 hoy en Amazon. Haga clic aquí para ver la lista completa de modelos elegibles y tenga en cuenta que se descontarán $ 10 adicionales en su carrito.
Tapas elásticas de silicona de Tomorrow's Kitchen, paquete de 12 | $14 | Amazonas | Código promocional 20OFFKINJALids son básicamente los calcetines de la cocina; siempre perdiéndose, dejando contenedores huérfanos que nunca podrán volver a cerrarse. Pero, ¿y si sus tapas pudieran estirarse y adaptarse a todos los recipientes, ollas, sartenes e incluso frutas en rodajas grandes que sobran? Nunca más tendrás que preocuparte por perder esa tapa tan específica.
Hemos pirateado algunas ciudades industriales en esta columna, como Los Ángeles y Las Vegas. Ahora es el momento de una ciudad militar-industrial-compleja.
Un minorista está enlatando su sección de tallas grandes. Pero no están tomando la categoría solo en línea o descontinuándola por completo.
El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.
Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon
El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.
El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".
Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.
Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.
“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.
Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.