html5 http download attributes cross-domain

El atributo de descarga HTML5 no funciona cuando se descarga desde otro servidor, incluso cuando Access-Control-Allow-Origin está configurado en all(*)



http download (1)

Tengo un enlace de descarga como este:

<a href="foo.xls" download="bar.xls">Foobar</a>

Esto funciona bien al descargar un archivo en el mismo servidor, pero cuando se descarga desde otro servidor (almacenamiento de blobs de Azure en este caso) el nombre del archivo permanece como "foo.xls", aunque la respuesta HTTP vuelve con el siguiente encabezado:

Acceso-Control-Permitir-Origen: *

¿Es esto por diseño o hay potencialmente otro encabezado que pueda agregar a la respuesta HTTP para que esto funcione?


Sí, es por diseño que los encabezados CORS no tienen ningún efecto en el atributo de download . Solo hay dos navegadores que admiten el atributo de download , Firefox y Chrome, y ambos navegadores tienen una política diferente sobre archivos de origen cruzado.

Las versiones de Chrome anteriores a la 65 realmente permitían el atributo de download en archivos de origen cruzado, sin encabezados CORS, pero Firefox decidió no hacerlo, citando posibles ataques de ingeniería social.

MDN documenta este comportamiento para Firefox 20 en la sección de atributos de download para la etiqueta a , comportamiento que no ha cambiado desde entonces.

En Firefox 20, este atributo solo se cumple para los enlaces a recursos con el mismo origen.


Este informe de Bugzilla discutió las preocupaciones de seguridad y la posibilidad de usar CORS.

Cuando el usuario hace clic en dicho enlace, se le preguntará si desea descargar. Parece muy fácil para el usuario cometer el error de pensar que se está descargando algo en el sitio web original, y no algo de bank.com.


¿Sería posible implementarlo teniendo en cuenta el mismo origen y CORS (Access-Control-Allow-Origin) si está cuestionando la seguridad de origen cruzado? Esta es una característica muy útil para aplicaciones web (cree Blob usando JS y permita que el usuario lo descargue con un nombre significativo)

Google se opuso al uso de CORS para esto.


También está este informe de Bugzilla , que resume su decisión del otro informe de error.

Además, las descargas de origen cruzado funcionan perfectamente en Google Chrome.

Sí, y creemos que están agregando errores de seguridad al hacerlo.

Los problemas de Bugzilla no parecen descartar la posibilidad de usar CORS para el soporte de atributos de download origen cruzado en el futuro, pero en este momento el uso de encabezados CORS no hace nada para el atributo de download . Es posible que si otros navegadores comienzan a admitir el atributo, aún se pueda llegar a un consenso.

En aras de la exhaustividad, por supuesto, existe el encabezado Content-Disposition que puede usar para forzar una descarga desde el otro dominio, pero esto no proporciona la misma funcionalidad que el atributo de download . Sin embargo, tiene un mejor soporte para el navegador.