programing

Express res.send 파일 던지기 금지 오류

yellowcard 2023. 9. 2. 08:09
반응형

Express res.send 파일 던지기 금지 오류

다음 코드가 있습니다.

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함수(put)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전송하는 파일의 루트로 사용됩니다.

또한 사용할 수 있습니다.path.join

const path = require("path");

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

언급URL : https://stackoverflow.com/questions/14594121/express-res-sendfile-throwing-forbidden-error

반응형