web-dev-qa-db-fra.com

Événement du navigateur lorsque le fichier téléchargé est enregistré sur le disque

J'ai des fichiers sensibles à télécharger pour les utilisateurs, et chaque utilisateur est autorisé à télécharger un fichier donné exactement une fois. Si le téléchargement échoue, je souhaite autoriser le re-téléchargement, mais pas autrement.

Il ne suffit pas de s'appuyer sur la journalisation/le traitement de la demande de téléchargement de fichier sur le serveur - J'ai besoin de savoir de façon déterministe quand le fichier est terminé et en place au client, car beaucoup de mes utilisateurs travaillent dans un environnement avec des baisses de connectivité fréquentes.

Le moyen le plus simple pour que cela fonctionne est que le navigateur expose un événement "fichier enregistré" à partir de la boîte de dialogue Enregistrer sous ... qui pourrait être connecté à une fonction JavaScript sur la page de téléchargement (qui pourrait être renvoyée sur le serveur). Mais, l'intuition suggère qu'il pourrait y avoir des failles de sécurité si les navigateurs exposaient cette fonctionnalité, car elle se faufile quelque peu en dehors du bac à sable. Je ne suis pas sûr que ce soit même possible.

I trouvéplusieursautrequestionsdans cette zone , mais rien sur ce problème en particulier .

Des idées?

Edit: Je n'aurais pas dû utiliser le mot "sécurité" dans la question d'origine, désolé d'avoir déclenché les harengs rouges.

Edit 2: Ma formulation "sécurité" a induit les gens en erreur sur des problèmes de sécurité technique, mais vous avez tous les deux confirmé mes soupçons: "non, il n'y a pas de support de navigateur pour cette." Je marque le premier commentateur avec la réponse depuis sa première phrase avait ce que je cherchais. Merci a tous.

20
David Pope

Il n'y a pas un tel événement de navigateur en JavaScript et même s'il y en avait, vous ne pouvez pas faire confiance au navigateur de l'utilisateur pour assurer votre sécurité.

Il vaut mieux utiliser un GUID pour générer une URL unique pour chaque téléchargement. Vous pouvez alors par exemple:

  • laissez l'URL être valide uniquement pour une période de temps spécifique
  • autoriser les transferts uniquement à partir d'une adresse IP spécifique associée à l'URL unique
  • laissez votre code côté serveur détecter lorsque le contenu d'une URL unique a été entièrement transféré, puis invalidez l'URL.

Permettez-moi de clarifier la dernière puce. Supposons que vous utilisez Java - vous allez in.read(buffer) et out.write(buffer) dans une boucle jusqu'à EOF. Si le client se déconnecte, vous recevrez un IOException pendant out.write() et sera en mesure de dire un téléchargement réussi à partir d'un téléchargement interrompu. Sur d'autres plates-formes, je suis sûr qu'il existe des moyens de savoir si la connexion a été perdue ou non.

EDIT: Vous pouvez réellement déclencher un événement de navigateur en utilisant l'astuce décrite dans la réponse acceptée de l'une des questions auxquelles vous avez lié . Ce ne serait cependant pas une solution fiable pour limiter le nombre de téléchargements.

9
Martin

C'est une bonne solution:

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

Il fonctionne essentiellement en définissant un cookie dans l'en-tête de réponse du fichier téléchargé, afin que javascript puisse périodiquement vérifier l'existence de ce cookie ...

19
rekna

Pourquoi est-il important que le fichier puisse être téléchargé "exactement une fois"? Une fois le fichier téléchargé, il pourrait être copié, y a-t-il vraiment un problème de sécurité à laisser le même utilisateur télécharger le fichier plus d'une fois?

Sinon, pourriez-vous faire quelque chose comme ceci:

  1. Générez une URL unique pour télécharger un fichier donné. (Utilisez un GUID pour obsfucuer si nécessaire)
  2. Associez cette URL à INFO UTILISATEUR (type de navigateur, adresse IP, etc.) ET À UNE FENÊTRE D'HEURE. Autoriser uniquement les téléchargements de cet utilisateur et pendant la fenêtre.
  3. La fenêtre doit être suffisamment longue pour que l'utilisateur remarque que le transfert a échoué et pour réessayer une ou deux fois, mais plus.

Le résultat final est:

  1. Vous pouvez être raisonnablement sûr que le fichier est uniquement téléchargé par le destinataire prévu.
  2. Vous pouvez être sûr que le destinataire ne peut télécharger le fichier que pendant une courte fenêtre.
  3. Le même utilisateur peut télécharger le fichier plusieurs fois, mais peu importe? Ce n'est pas différent que de faire une copie locale du premier fichier.

Si cela vous inquiète vraiment, enregistrez chaque demande de téléchargement et exécutez un rapport planifié pour les fichiers téléchargés plusieurs fois. Si quelque chose vous semble louche, vous pouvez alors examiner les journaux de sécurité, parler à l'utilisateur, etc.

2
Seth Petry-Johnson