Хром 65 блокирует перекрестное происхождение. Обходной путь на стороне клиента для принудительной загрузки?



Chrome 65 удалил поддержку атрибута download на якорных элементах с перекрестным началом hrefs:




Block cross-origin



Чтобы избежать того, что по сути является пользовательской перекрестной утечкой информации, Blink теперь будет игнорировать наличие атрибута загрузки на якорных элементах с перекрестными атрибутами происхождения. Обратите внимание, что это относится к HTMLAnchorElement.download Как и к самой стихии.



Намерение удалить | Chromestatus Tracker | Chromium Bug




Это прерывает бессерверные загрузки (Для ресурсов кросс-происхождения). он также сломал кнопку сохранения изображения Reddit Enhancement Suite (.res-media-controls-download) RES v5. 12. 0 исправил это, используя хром .downloads API (расширение теперь запрашивает ваше разрешение на Управление загрузками)



Есть ли обходной путь?

715   2  

2 ответов:

Согласно обсуждению blob: и data: url-адреса не затрагиваются, поэтому вот обходной путь с использованием fetch и капли.

Загрузочный носитель на стороне клиента

function forceDownload(blob, filename) {
  var a = document.createElement('a');
  a.download = filename;
  a.href = blob;
  a.click();
}

// Current blob size limit is around 500MB for browsers
function downloadResource(url, filename) {
  if (!filename) filename = url.split('\\').pop().split('/').pop();
  fetch(url, {
      headers: new Headers({
        'Origin': location.origin
      }),
      mode: 'cors'
    })
    .then(response => response.blob())
    .then(blob => {
      let blobUrl = window.URL.createObjectURL(blob);
      forceDownload(blobUrl, filename);
    })
    .catch(e => console.error(e));
}

downloadResource('https://giant.gfycat.com/RemoteBlandBlackrussianterrier.webm');

Однако fetch работает только на некоторых URL-адресах. Вы можете получить ошибку CORS:

Failed to load https://i.redd.it/l53mxu6n14o01.jpg: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://redditp.com' is therefore not allowed access.

Существуют расширения, которые позволяют перехватывать и изменять или удалять заголовки безопасности веб-сайтов:

UnXSS-Chrome Web Store

(но установка Access-Control-Allow-Origin: * сломал YouTube для меня)

Tampermonkey

Если ваш вариант использования-Tampermonkey, то GM_download(details), GM_download(url, name)

⚠ это бета-функция, и вы должны сначала установить режим загрузки: [Browser API ▾] в Tampermonkey Dashboard > настройки

Панель Мониторинга Tampermonkey > Настройки > Загрузки

function forceDownload(blob, filename) {
  var a = document.createElement('a');
  a.download = filename;
  a.href = blob;
  a.click();
}

// Current blob size limit is around 500MB for browsers
function downloadResource(url, filename) {
  if (!filename) filename = url.split('\\').pop().split('/').pop();
  fetch(url, {
      headers: new Headers({
        'Origin': location.origin
      }),
      mode: 'cors'
    })
    .then(response => response.blob())
    .then(blob => {
      let blobUrl = window.URL.createObjectURL(blob);
      forceDownload(blobUrl, filename);
    })
    .catch(e => console.error(e));
}

downloadResource('https://giant.gfycat.com/RemoteBlandBlackrussianterrier.webm');

Comments

    Ничего не найдено.