194 votes

Express res.sendfile lance une erreur interdite

J'ai ce code :

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

Cependant, cette erreur s'est produite :

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)

Quelqu'un peut-il me dire pourquoi ?

344voto

Joe Points 17829

Je pense que c'est à cause du chemin relatif ; le "../" est considéré comme malveillant. Résolvez d'abord le chemin local, puis appelez res.sendfile . Vous pouvez résoudre le chemin avec path.resolve au préalable.

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

45voto

derekdreery Points 609

Cette réponse rassemble les informations des autres réponses/commentaires.

Cela dépend si vous voulez inclure quelque chose de relatif au répertoire de travail du processus (cwd) ou au répertoire des fichiers. Les deux utilisent la balise path.resolve fonction (mettre var path = require('path') en haut du fichier.

  • relatif au cwd : path.resolve('../../some/path/to/file.txt');
  • relatif au fichier : path.resolve(__dirname+'../../some/path/to/file.txt');

D'après la lecture du lien du commentaire de @Joe, il semble que les chemins relatifs constituent un risque pour la sécurité si vous acceptez la saisie du chemin par l'utilisateur (par ex. sendfile('../.ssh/id_rsa') pourrait être le premier essai d'un pirate).

35voto

tenor528 Points 935

El Documentation express suggère de le faire d'une manière différente, et à mon avis, cela a plus de sens plus tard que la solution actuelle.

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

L'option Root semble régler ./ comme répertoire racine de votre projet. Je ne peux donc pas dire exactement où se trouve votre fichier par rapport à la racine du projet, mais si votre dossier temporaire se trouve à cet endroit, vous pouvez configurer ./temp comme racine du fichier que vous envoyez.

4voto

Lalit Vavdara Points 128

Vous pouvez également utiliser path.join

const path = require("path");

router.get("/", (req, res) => {
  let indexPath = path.join(__dirname, "../public/index.html");
  res.sendFile(indexPath);
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X