[node.js] 금지 된 오류를 던지는 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)

아무도 이것이 왜 그런지 말해 줄 수 있습니까?



답변

상대 경로 때문이라고 생각합니다. “../”는 악성으로 간주됩니다. 먼저 로컬 경로를 확인한 다음을 호출하십시오 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보내는 파일의 루트로 설정할 수 있습니다 .


답변