Экспресс res.sendfile, бросающий запрещенную ошибку
У меня есть этот код:
res.sendfile( '../../temp/index.html' )
Однако это вызывает эту ошибку:
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)
Может ли кто-нибудь сказать мне, почему это может быть?
Ответы
Ответ 1
Я считаю это из-за относительного пути; "../" считается злонамеренным. Сначала разрешите локальный путь, затем вызовите res.sendfile
. Вы можете разрешить путь с помощью path.resolve
заранее.
var path = require('path');
res.sendFile(path.resolve('temp/index.html'));
Ответ 2
Этот ответ собирает информацию из других ответов/комментариев.
Это зависит от того, хотите ли вы включить что-то относительно рабочего каталога процесса (cwd) или каталога файлов. Оба используют функцию path.resolve
(поместите var path = require('path')
в верхнюю часть файла.
- относительно cwd:
path.resolve('../../some/path/to/file.txt');
- относительно файла:
path.resolve(__dirname+'../../some/path/to/file.txt');
Из чтения ссылки из комментария @Joe это звучит как относительные пути - это риск для безопасности, если вы принимаете пользовательский ввод для пути (например, sendfile('../.ssh/id_rsa')
может быть первым попыткой хакера).
Ответ 3
Экспресс-документация предлагает сделать это по-другому, и, на мой взгляд, это имеет смысл позже, чем текущее решение.
res.sendFile('index.html', {root: './temp});
Параметр root, по-видимому, устанавливает ./
в качестве корневого каталога вашего проекта. Поэтому я не могу полностью указать, где вы находитесь, в отношении корня проекта, но если ваша временная папка существует, вы можете установить ./temp
в качестве корня для отправляемого файла.