Событие браузера, когда загруженный файл сохраняется на диск - PullRequest
19 голосов
/ 26 февраля 2010

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

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

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

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

Есть идеи?

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

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

Ответы [ 3 ]

18 голосов
/ 23 февраля 2011

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

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

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

9 голосов
/ 26 февраля 2010

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

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

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

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

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

2 голосов
/ 26 февраля 2010

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

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

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

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

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

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

...