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

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

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

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

Я нашел несколько других вопросов в этой области, но ничего конкретно об этой проблеме.

Есть идеи?

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам