Подтвердить что ты не робот

Событие браузера, когда загруженный файл сохраняется на диске

У меня есть конфиденциальные файлы для загрузки пользователям, и каждому пользователю разрешено загружать данный файл ровно один раз. Если загрузка не удалась, я хочу разрешить повторную загрузку, но не иначе.

Недостаточно полагаться на ведение журнала/обработку файла запрос на сервере - мне нужно знать детерминистически, когда файл завершен и находится на месте у клиента, так как многие мои пользователи работают в среде с частыми связями падает.

Самым простым способом для этого было бы, если бы браузер обнаружил событие "файл сохранено" в диалоговом окне "Сохранить как...", которое можно было подключить к функции JavaScript на странице загрузки (которая могла бы вернуться к сервер). Но, интуиция предполагает, что могут быть дыры в безопасности, если браузеры раскрывают эту функциональность, поскольку она немного пробирается за пределы песочницы. Я не уверен, что это возможно.

I найдено несколько другие questions в этой области, но ничего об этом конкретно не говорится.

Любые идеи?

Изменить: Я не должен был использовать слово "безопасность" в исходном вопросе, извините за запуск красных сельдей.

Изменить 2: Моя фраза "безопасность" вводит в заблуждение людей в оффтопические проблемы технической безопасности, но вы оба подтвердили мое подозрение, что "нет, для этого нет поддержки браузером". Я отмечаю первого комментатора с ответом, так как его первое предложение имело то, что я искал. Спасибо всем.

4b9b3361

Ответ 1

В JavaScript нет такого события для браузера, и даже если бы вы не могли доверять браузеру пользователя, чтобы обеспечить вам безопасность.

Вам лучше использовать GUID для создания уникального URL-адреса для каждой загрузки. Тогда вы можете:

  • пусть URL будет действителен только в течение определенного периода времени
  • разрешает перенос только с определенного IP-адреса, связанного с уникальным URL
  • чтобы ваш серверный код обнаружил, когда содержимое для уникального URL-адреса было полностью перенесено, а затем недействительно URL-адрес.

Позвольте мне прояснить последнюю пулю. Предположим, вы используете Java - вы будете in.read(buffer) и out.write(buffer) в цикле до EOF. Если клиент отключится, вы получите IOException во время out.write() и сможете сказать успешную загрузку с прерванного. На других платформах я уверен, что есть способы определить, было ли соединение потеряно или нет.

РЕДАКТИРОВАТЬ:. Фактически вы можете запустить событие браузера с помощью трюка, изложенного в принятом ответе одного из вопросов, которые вы связали с. Это, однако, не будет надежным решением для ограничения количества загрузок.

Ответ 2

Это хорошее решение:

http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/

Это в основном работает, устанавливая cookie в заголовке ответа загруженного файла, поэтому javascript периодически может проверять существование этого cookie...

Ответ 3

Почему важно, чтобы файл можно было загружать "ровно один раз"? Как только файл будет загружен, он может быть скопирован, так что действительно ли проблема с безопасностью, позволяющая одному и тому же пользователю загружать файл более одного раза?

Если нет, вы могли бы сделать что-то вроде этого:

  • Создайте уникальный URL-адрес для загрузки данного файла. (Используйте GUID, чтобы при необходимости обсчитывать)
  • Свяжите этот URL с ПОЛЬЗОВАТЕЛЕЙ (тип браузера, IP-адрес и т.д.) и ВРЕМЕННОЕ ОКНО. Разрешать загрузку только от этого пользователя и в течение окна.
  • Окно должно быть достаточно длинным, чтобы пользователь мог заметить, что передача не удалась, и повторить попытку один или два раза, но больше не нужно.

Конечный результат:

  • Вы можете быть уверены, что файл загружается только предполагаемым получателем.
  • Вы можете быть уверены, что получатель может загружать только файл в течение короткого окна.
  • Тот же пользователь может загружать файл более одного раза, но кому это нужно? Это ничем не отличается от создания локальной копии первого файла.

Если вы действительно беспокоитесь об этом, запишите каждый запрос на загрузку и запустите запланированный отчет для файлов, которые были загружены более одного раза. Если что-то выглядит подозрительно, вы можете проверить журналы безопасности, поговорить с пользователем и т.д.