Evento browser quando il file scaricato viene salvato su disco

Dispongo di file sensibili da scaricare agli utenti e ogni utente può scaricare un determinato file esattamente una volta. Se il download non riesce, voglio consentire il re-download, ma non altrimenti.

Non è sufficiente affidarsi alla registrazione / elaborazione della richiesta di download del file sul server – ho bisogno di sapere in modo deterministico quando il file è completo e installato sul client, poiché molti dei miei utenti lavorano in un ambiente con frequenti cadute di connettività.

Il modo più semplice per farlo funzionare sarebbe se il browser esponesse un evento “file salvato” dalla finestra di dialogo Salva con nome … che potrebbe essere collegato a una funzione JavaScript nella pagina di download (che potrebbe postare sul server). Ma, l’intuizione suggerisce che potrebbero esserci dei buchi di sicurezza se i browser esponessero questa funzionalità, dato che si avvicina un po ‘al di fuori della sandbox. Non sono sicuro che questo sia ansible.

Ho trovato molte altre domande in questo settore , ma niente su questo problema in particolare.

Qualche idea?

Modifica: non avrei dovuto usare la parola “sicurezza” nella domanda originale, mi dispiace per aver triggersto le false piste.

Modifica 2: La mia frase di “sicurezza” ha ingannato la gente in problemi tecnici di sicurezza, ma entrambi hanno confermato il mio sospetto che “no, non c’è supporto per il browser per questo”. Segnalo il primo commentatore con la risposta dato che la sua prima frase aveva quello che stavo cercando. Ringrazia tutti.

    Non esiste un tale evento browser in JavaScript e anche se non ci si poteva fidare del browser dell’utente per fornire sicurezza per te.

    È meglio utilizzare un GUID per generare un URL univoco per ogni download. Puoi quindi ad esempio:

    • lasciare che l’URL sia valido solo per un periodo di tempo specifico
    • consentire i trasferimenti solo da un indirizzo IP specifico associato all’URL univoco
    • lascia che il tuo codice lato server rilevi quando il contenuto di un URL univoco è stato completamente trasferito e quindi invalida l’URL.

    Permettetemi di chiarire l’ultimo proiettile. Supponiamo che tu stia utilizzando Java: in.read(buffer) e out.write(buffer) in un ciclo fino a EOF. Se il client si disconnette, riceverai out.write() IOException durante out.write() e sarà in grado di indicare un download di successo da uno interrotto. Su altre piattaforms, sono sicuro che ci sono modi per dire se la connessione è stata persa o meno.

    EDIT: potresti effettivamente triggersre un evento del browser utilizzando il trucco indicato nella risposta accettata di una delle domande a cui ti sei collegato . Tuttavia, non sarebbe una soluzione affidabile per limitare il numero di download.

    Questa è una buona soluzione:

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

    Funziona fondamentalmente impostando un cookie nell’intestazione della risposta del file scaricato, quindi javascript può controllare periodicamente l’esistenza di questo cookie …

    Perché è importante che il file possa essere scaricato “esattamente una volta”? Una volta scaricato, il file può essere copiato, quindi c’è davvero un problema di sicurezza con lo stesso utente che scarica il file più di una volta?

    In caso contrario, potresti fare qualcosa del genere:

    1. Genera un URL univoco per scaricare un determinato file. (Utilizzare un GUID per eseguire l’obsfucate se necessario)
    2. Associa quell’URL con USER INFO (tipo di browser, indirizzo IP, ecc.) E UNA FINESTRA DI TEMPO. Consenti solo download da quell’utente e durante la finestra.
    3. La finestra dovrebbe essere abbastanza lunga da consentire all’utente di notare il trasferimento non riuscito e riprovare una o due volte, ma non più.

    Il risultato finale è:

    1. Puoi essere ragionevolmente sicuro che il file venga scaricato solo dal destinatario previsto.
    2. Puoi essere sicuro che il destinatario può solo scaricare il file durante una breve finestra.
    3. Lo stesso utente potrebbe scaricare il file più di una volta, ma a chi importa? Non è diverso da fare una copia locale del primo file.

    Se sei davvero preoccupato, registra ogni richiesta di download ed esegui un rapporto pianificato per i file che sono stati scaricati più di una volta. Se qualcosa sembra strano, puoi esaminare i registri di sicurezza, parlare con l’utente, ecc.