본문 바로가기
Node.js/이론 및 용어

path 모듈로 상대 경로 제거를 이용한 보안 방법

by tokkiC 2022. 9. 2.

생활 코딩 Nodejs 강의 중 url 의 쿼리 데이터를 통해 경로를 입력하여

서버의 컴퓨터의 데이터를 접근 할 수 있어 보안에 취약할 수 있다는 점을 배웠다

냅두면 이런 깡패 = 해커들이 나쁜 짓을 할 수도 있다

그 예시로 다음과 같은 페이지를 만들기 위해 아래와 같은 경로를 가진 서버의 경우

각각의 뷰 페이지 데이터는 루트 폴더 기준 data 폴더 내에 저장하고 있고

fs 모듈의 readdir 로 data 폴더내 파일들을 찾아

readfile 로 파일의 내용을 읽어오는 방식으로 설계하였는데

개인정보를 저장하기 위한 password.js 는 data 폴더의 상위 디렉토리에 위치시켰다

같은 data 폴더 내가 아니므로 password.js 파일은 읽히지 않겠지? 라는 생각은 위험하다

const queryData = new URL("http://localhost:3000" + _url);

쿼리 스트링 대신 URL 객체를 사용하여 id 값을 가져와 url 의 쿼리에 붙여서 아래와 같이 파일의 경로를 가져오는데

fs.readFile(`data/${id}`, "utf-8", (err, description) => {어쩌고 저쩌고}

id 변수의 양식을 정해주지 않았으므로 id 값이 '../password.js' 와 같이 파일명 앞에

상대 경로를 포함할 수 있다는 문제가 생긴다

이러면 data 폴더 외에 상위 폴더에도 접근 가능하여 개인정보를 가진 password.js 파일에도 접근가능해지며

그 외에도 서버쪽 파일들이 상대경로를 통해 모두 노출되어 접근 가능해진다

이를 막기 위해서 path 모듈의 parse() 메소드를 이용해서

path.parse('../password.js')

// { root: '', dir: '../', base: 'password.js', ext: '.js', name: 'password' }

와 같은 객체를 얻은 후 위 객체에서 base 속성만 불러와서

path.parse('../password.js').base

// password.js

상대 경로를 뺀 파일명만 가져오도록 하여

data 폴더내에서만 파일명으로 접근 가능하도록 하여 보안을 강화하도록 할 수 있다

생활코딩 web2 node.js 에서는 위의 방법으로 path 모듈을 사용하여 취약점을 막는 보안의 방법 중 하나를 설명하였다

댓글