Tengo este codigo:
res.sendfile( '../../temp/index.html' )
Sin embargo, arroja este error:
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)
¿Alguien puede decirme por qué podría ser esto?
res.sendfile
path.resolve
Debe hacer lo que necesita.Respuestas:
Creo que es por el camino relativo; el "../" se considera malicioso. Primero resuelva la ruta local, luego llame
res.sendfile
. Puede resolver el camino depath.resolve
antemano.fuente
sendfile
como malas. A menos que especifique elroot
parámetro de directorio, como se ve aquí: github.com/visionmedia/express/issues/1465const
se prefiere sobrevar
Esta respuesta reúne la información de las otras respuestas / comentarios.
Depende de si desea incluir algo relativo al directorio de trabajo del proceso (cwd) o al directorio del archivo. Ambos usan la
path.resolve
función (ponervar path = require('path')
en la parte superior del archivo.path.resolve('../../some/path/to/file.txt');
path.resolve(__dirname+'../../some/path/to/file.txt');
Al leer el enlace del comentario de @ Joe, parece que las rutas relativas son un riesgo de seguridad si acepta la entrada del usuario para la ruta (por ejemplo,
sendfile('../.ssh/id_rsa')
podría ser el primer intento de un pirata informático).fuente
La documentación de Express sugiere hacerlo de una manera diferente, y en mi opinión tiene más sentido que la solución actual.
res.sendFile('index.html', {root: './temp'});
La opción raíz parece configurarse
./
como el directorio raíz de su proyecto. Por lo tanto, no puedo decir completamente dónde está su archivo en relación con la raíz del proyecto, pero si su carpeta temporal está allí, puede establecerla./temp
como la raíz del archivo que está enviando.fuente
.sendfile
sino porque se basa completamente en otra cosa (ruta). Gracias por señalar esto.