El atributo de descarga de HTML5 no funciona cuando se descarga desde otro servidor, incluso cuando Access-Control-Allow-Origin se establece en todos (*)

Tengo un enlace de descarga así:

Foobar 

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 de archivo permanece como “https://stackoverflow.com/questions/28318017/html5-download-attribute-not-working-when-downloading-from-another-server-even/foo.xls”, aunque la respuesta HTTP vuelve con el siguiente encabezado:

Access-Control-Allow-Origin: *

¿Esto es por diseño o hay potencialmente otro encabezado que puedo agregar a la respuesta HTTP para que esto funcione?

Sí, es por diseño que los encabezados CORS no afectan el atributo de download . Solo hay dos navegadores compatibles con el atributo de download , Firefox y Chrome, y ambos navegadores tienen una política diferente sobre los archivos de origen cruzado.

Chrome realmente permite el atributo de download en archivos de origen cruzado, sin encabezados CORS, pero Firefox optó por no hacerlo, citando posibles ataques de ingeniería social.

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

En Firefox 20, este atributo solo se utiliza para 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 descargarlo. 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 con el mismo origen y CORS (Access-Control-Allow-Origin) en mente si está cuestionando la seguridad de origen cruzado? Esta es una característica muy útil para aplicaciones web (crea Blob usando JS y deja que el usuario lo descargue con algún nombre significativo)

Google se opuso a usar CORS para esto.

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

Además, las descargas cruzadas de origen están funcionando perfectamente en Google Chrome.

Sí, y creemos que agregan errores de seguridad al hacer eso.

Los problemas de Bugzilla no parecen descartar la posibilidad de utilizar CORS para soporte de atributo de download origen entre países en el futuro, pero ahora usar 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 alcanzar un consenso.

En aras de la exhaustividad, existe, por supuesto, 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 mejor soporte para el navegador.