이 코드가 있습니다 :
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)
아무도 이것이 왜 그런지 말해 줄 수 있습니까?
답변
상대 경로 때문이라고 생각합니다. “../”는 악성으로 간주됩니다. 먼저 로컬 경로를 확인한 다음을 호출하십시오 res.sendfile
. path.resolve
미리 경로를 확인할 수 있습니다 .
var path = require('path');
res.sendFile(path.resolve('temp/index.html'));
답변
이 답변은 다른 답변 / 댓글에서 정보를 수집합니다.
프로세스 작업 디렉토리 (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')
해커의 첫 번째 시도 일 수 있음).
답변
Express 설명서는 그것을 다른 방식으로 일을 제안하고, 내 의견으로는 나중에 현재의 솔루션보다 더 의미가 있습니다.
res.sendFile('index.html', {root: './temp'});
루트 옵션은 ./
프로젝트의 루트 디렉토리 로 설정된 것 같습니다 . 따라서 프로젝트 루트와 관련하여 파일이 어디에 있는지 완전히 알 수는 없지만 임시 폴더가 있으면 ./temp
보내는 파일의 루트로 설정할 수 있습니다 .