2013-10-23 1 views
0

저는 nodejs를 사용하고 있으며 일부 사이트는 공개 파일이 포함 된 특정 디렉토리에서 기본적으로 fs.readFile을 사용하여 파일을 제공합니다. 예를 들어 mydomain.com:1234/hello/info.html을 요청하면 내 스크립트에서 파일 publicfiles/hello/info.html을 요청하고 결과를 클라이언트에 보냅니다. 그러나 공격자가 mydomain.com:1234/../evilurl/userpasswords.txt에 입력 한 경우 nodejs가 publicfiles/../evilurl/userpasswords.txt이라는 파일을 얻으려고 시도하는데 이는 실제로 evilurl/userpasswords.txt과 동일하므로 publicfiles 디렉토리의 파일에 액세스하여 "안전한"정보에 액세스 할 수 있다는 것을 알고 있습니다. req.url..이 포함되지 않도록하여이를 방지 할 수는 있지만 사용자가 불량 파일에 액세스 할 수있는 다른 방법이 있습니까? 같은 것을 의미하는 .. 대신 이스케이프 시퀀스를 사용할 수 있습니까? 또한, 나는 이것을 위해 익스프레스를 사용하고 싶지 않다. 특별히 이것을위한 라이브러리가 있다면, 괜찮습니다.하지만 익스프레스와 같은 거대한 프레임 워크는 원하지 않습니다.안전한 URL을 보장합니다 nodejs

+0

Express는 "거대한 프레임 워크"가 아닙니다. 당신이 그것을 사용해야합니다. 아니면 그냥 https://npmjs.org/package/st – SLaks

+0

@ Slaks를 사용하십시오. 당신 말이 맞을 것 같습니다. 익스프레스는 라우팅 프레임 워크 일뿐입니다. 아 그래, 요청 관리도있다. 그게 전부입니다. 잠깐,보기도 처리 할 수 ​​있습니다. 오직 세 가지 주요 기능. 그게 전부입니다. 아니요, 잠깐, 세션 관리도 수행됩니다. 당신은 아이디어를 얻습니다. – Markasoftware

+1

@Markasoftware "* 요청 관리 *"에 무슨 뜻인지 확실하지 않습니다. 미들웨어? 그렇다면 그 대부분은 전적으로 옵트 인입니다. 'session()'관리를 포함하여 명시 적으로 'use()'해야합니다. 또한 Express는보기를 지원하지 않습니다. 뷰 엔진에 대한 일반적인 래퍼를 제공합니다. 그리고 뷰 엔진을 사용하고 싶지 않다면하지 마라. 'write()'/'end()','send()','sendfile()'할 수 있습니다. –

답변

1

정적 콘텐츠를 제공하기 위해 기성품 패키지를 사용하는 것을지지합니다. 지금까지 정적 컨텐츠를 제공하기 위해 httpd/ngnix를 사용해야한다고 말하기까지했습니다.

즉, path.resolve()을 사용할 수 있습니다. 기본 경로 publicfiles/에 대한 요청 경로를 확인한 다음 결과에 publicfiles/이라는 접두사가 있는지 확인하십시오. 그렇지 않으면 나쁜 요청입니다.

+0

path.resolve의 제안에 감사드립니다. 작동하도록 만들었습니다. 몇 가지 예제 코드와 문서에 대한 링크를 제공 할 수 있다면 더 좋았 겠지만 괜찮습니다. 감사! 또한 정적 파일 제공 이상의 노드를 사용하는 동일한 프로젝트의 일부가 있기 때문에 Apache/httpd를 사용하고 싶지 않습니다. – Markasoftware