Esprimere file res.end che genera un errore proibito


160

Ho questo codice:

res.sendfile( '../../temp/index.html' )

Tuttavia, genera questo errore:

Error: Forbidden
at SendStream.error (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:145:16)
at SendStream.pipe (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:307:39)
at ServerResponse.res.sendfile (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:339:8)
at exports.boot (/Users/Oliver/Development/Personal/Reader/server/config/routes.js:18:9)
at callbacks (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:161:37)
at param (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:135:11)
at pass (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:170:5)
at Object.router (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:33:10)
at next (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/proto.js:199:15)

Qualcuno può dirmi perché questo potrebbe essere?


3
Credo sia a causa del percorso relativo; il "../" è considerato dannoso. Risolvi prima il percorso locale, quindi chiamares.sendfile
Joe

Come risolvi il percorso locale?

4
path.resolvedovrebbe fare quello che ti serve.
Joe

1
Quello l'ha fatto. Vuoi incollarlo come risposta?

Risposte:


286

Credo sia a causa del percorso relativo; il "../" è considerato dannoso. Risolvi prima il percorso locale, quindi chiama res.sendfile. È possibile risolvere il percorso in path.resolveanticipo.

var path = require('path');
res.sendFile(path.resolve('temp/index.html'));

31
maggiori dettagli sarebbero utili qui per i neofiti come me
Adam Waite,

5
Express considera i percorsi relativi sendfilecome cattivi. A meno che non specifichi il rootparametro della directory, come mostrato qui: github.com/visionmedia/express/issues/1465
Joe

2
var path = require ('percorso');
Matt Harrison,

1
sì, il codice finale !!
SuperUberDuper,

2
L'aggiornamento @MattHarrison ES6, per l'importazione di pacchetti, constè preferito rispetto avar
Nino Filiu

39

Questa risposta raccoglie le informazioni dalle altre risposte / commenti.

Dipende se si desidera includere qualcosa in relazione alla directory di lavoro del processo (cwd) o alla directory del file. Entrambi usano la path.resolvefunzione (posizionata var path = require('path')all'inizio del file.

  • rispetto a cwd: path.resolve('../../some/path/to/file.txt');
  • relativo al file: path.resolve(__dirname+'../../some/path/to/file.txt');

Dalla lettura del link dal commento di @ Joe, sembra che i percorsi relativi siano un rischio per la sicurezza se si accetta l'input dell'utente per il percorso (ad esempio, sendfile('../.ssh/id_rsa')potrebbe essere il primo tentativo di un hacker).


1
Come principiante, voglio sapere come è arrivato lo scenario degli hacker?
Bharath Muppa

2
Se consenti accidentalmente all'utente di inserire il percorso del file che desidera scaricare, potrebbe scaricare qualsiasi file sul tuo sistema (ho fornito l'esempio di una chiave privata ssh - che darebbe loro la possibilità di fingere di essere il tuo PC ( man-in-the-middle-etc)). La limitazione .. non consente questa possibilità poiché è possibile accedere solo ai file dal sito Web.
Derekdreery,

30

La documentazione di Express suggerisce di farlo in un modo diverso, e secondo me ha più senso dopo la soluzione attuale.

res.sendFile('index.html', {root: './temp'});

L'opzione root sembra essere impostata ./come directory root del tuo progetto. Quindi non posso dire completamente dove si trova il tuo file in relazione alla radice del progetto, ma se la tua cartella temporanea è lì, puoi impostare ./tempcome root per il file che stai inviando.


1
Ciò è vero, ma utilizza sendFile (maiuscola F, supportato da Express v4.8.0 in poi) invece del file di invio precedente utilizzato dall'OP.
Sto

Ahh ... buona cattura. Non ho notato questa piccola differenza. Mi chiedo anche se la risposta selezionata non funziona perché utilizza .sendfilema perché dipende completamente da qualcos'altro (percorso). Grazie per averlo segnalato.
tenor528,

Semplice ed efficiente. Grazie! Questo ha funzionato perfettamente per me!
Emanuela Colta,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.