2013-01-22 11 views
6

Esistono molti articoli, esercitazioni e domande sui caricamenti di file nel nodo, ma per lo più sono per principianti e nessuno di questi spiega pienamente come proteggere i caricamenti di file per la produzione. Ho provato molto duramente a trovare una risposta completa su come farlo, ma non ha avuto successo.Come caricare in modo sicuro i file nel nodo con Express?

Di seguito è una spiegazione dei miei risultati.

  1. Limite dimensione del file in upload:

    app.use(express.limit('4mb')); 
    
  2. il caricamento di file Limitato a solo determinati percorsi: Non riesco a far questo in realtà lavorare ma qui è quello che ho provato:

    Sostituire:

    app.use(express.bodyParser()); 
    

    con

    app.use(express.json()); 
    app.use(express.urlencoded()); 
    

    e aggiungere il middleware più parti ad ogni percorso di upload:

    app.post('/upload', express.multipart(), uploadController.uploadPhoto); 
    

    Questa parte non funziona, ma l'upload funziona bene se lascio express.bodyParser(). Quindi cosa sto sbagliando?

  3. Controllo tipo di file caricato prima di salvare caricare su disco:

    non riuscivo a capire questa parte, ma un suggerimento è stato quello di scrivere un middleware personalizzato che utilizza formidabile per analizzare upload di file e cercando di ridimensionare il file prima che venga salvato (supponendo che sia un'immagine) usando una libreria come la magia dell'immagine. Il suggerimento era che questo avrebbe reso l'immagine sicura e garantire che fosse effettivamente un'immagine (perché il processo fallirebbe se non fosse un'immagine).

    Ciò funzionerebbe solo con le immagini, quindi non è una soluzione completa.

    Come posso implementarlo? Qualche codice di esempio?

C'è qualcos'altro che mi manca perché i caricamenti siano sicuri?

+0

3 sarebbe la strada da percorrere, partendo dal presupposto che 2 non funziona. Se lo è, allora quella sarà la soluzione ideale. –

+0

Da quello che ho letto 2 dovrebbe funzionare, sto facendo qualcosa di sbagliato? Hai anche qualche esempio su come fare 3? Ho provato a farlo e non ha avuto successo. La maggior parte del codice che ho trovato non funzionava con la nuova versione di Express –

+0

Puoi per favore creare il progetto più piccolo possibile usando 2 e condividere il codice, possibilmente su github. Ci darò un'occhiata. Se non funziona, ne costruirò 3 per te e li condividerò. –

risposta

2

L'approccio 2 funziona effettivamente. Il problema che ho avuto è stato il

app.use(passport.session()); 

che gli impediva di funzionare. Pertanto, se si utilizza passport.js per l'autenticazione, questo potrebbe essere il problema. Se utilizzi questo approccio, assicurati di aggiungere la sicurezza sul percorso effettivo.


ho finito per usare questo plugin

https://github.com/tih-ra/alleup

che funziona alla grande con i caricamenti di immagine e automaticamente ridimensiona i file da più versioni e loro di Amazon S3 carica.L'utilizzo di questo plugin sarebbe in linea con l'approccio 3, ma i file vengono caricati prima nella cartella tmp e quindi eliminati.

+0

Pensavo che la tua domanda iniziale riguardasse la protezione dei percorsi per i caricamenti di file. Ad esempio, qualcuno pubblica un modulo multipart con file allegato a un percorso '/ restricted-path', cosa faresti allora? –

+0

bene il plugin usa formidabile per elaborare i caricamenti di file e per farlo funzionare multipart non deve essere utilizzato in modo che i caricamenti non possano essere registrati su qualsiasi percorso. Ho un altro problema però che passport.session() si ferma formidabile dall'attivazione degli eventi di file http://stackoverflow.com/questions/14479343/in-node-js-why-does-passport-session-stop-formidable-from-triggering -file-anche così ho bisogno di risolvere questo problema o capire come fare il numero 2. –

+0

ok così ho capito che app.use (passport.session()) è ciò che rende il numero 2 non funziona. Penso che sia qualcosa legato a passport.session() che deve essere chiamato dopo la multipart e non prima. Non sono ancora sicuro di come farlo su un percorso per basi di rotta –

1

Sto utilizzando multiparty per il caricamento (e lo streaming) di file.

var form = new multiparty.Form();

A 1:

form.on('progress', function (bytesReceived) { 
    if (262144000 < bytesReceived) { 
    abortConnection('filesizeexeeded'); 
    } 
}); 

implementare la propria funzione di interruzione di collegamento; ad esempio:

avviso: il browser probabilmente riproverà il caricamento (fino a 4 volte). Sto usando una connessione websocket per cancellare il caricamento sul lato client.

A 2: (uso multipartitico)

A 3: ho creato un gist che mostra come controllare il tipo MIME al volo usando mmmagic.

Se si utilizza il passaporto in combinazione con multipartitico si potrebbe trovare questo utile:

https://github.com/jaredhanson/passport/pull/106#issuecomment-14188999

+0

Sembra buono ma come si ottiene il filestream quando si utilizza il multiplay? Ho avuto questo problema molto tempo fa e ancora non riesco a trovare una risposta. –

Problemi correlati