괜찮아 잘하고있어 힘내

46. App 제작 - 입력정보에 대한 보안 본문

웹 개발/Node.js

46. App 제작 - 입력정보에 대한 보안

코오올라 2020. 12. 28. 20:36

나중에 데이터베이스를 이용해 데이터를 관리하게 될것이다.

데이터베이스는 id와 password가 있어야 데이터를 가져올 수 있는데

id와 password는 어딘가에 저장돼 있어야 한다.

예를들어 main.js와 같은 디렉토리에 password.js 라는 모듈을 만들고

그안에

id와 password값이 저장된 객체를 저장한다.

 

 

id=HTML 이라는 정보는

27) queryData.id라고 하는 형태로 데이터가 들어오게 된다.

 

그런데 우리가 직접 주소창에 url을 수정해 id값을 ../password.js로 바꾼다면

우리가 저장한 모듈의 내용이 웹페이지에서 볼 수 있게 되므로 보안상 아주 취약하다.

 

여기서 ../password.js 이부분은

27번째 줄에 fs.readFile( ) 의 첫번째 인자인 경로 부분에서 queryData.id 부분이 지워지고 ../password.js가 들어간 상태이다.

즉, fs.readFile(`data/../password.js',   .....)    ->  이런식이다. 이 경로의 뜻은 현재 디렉토리에서 부모디렉토리에 password.js를 가리키게 된다.

즉, 현재 경로는 data이기 때문에 data 디렉토리에서 부모디렉토리로 나오면 password.js가 있다.

그래서 경로만 바꿔줬는데 password.js 안에 내용을 볼 수 있는것이다.

 

[nodejs path parse]

 

dir -> ..을 붙인것은 dir이라는 별도의 프로퍼티로 분석되서 나오고 있다.

ext -> .js (확장자)

.base를 붙여 password.js라고 해도 경로를 탐색해 나갈 수 있는 정보를 세탁 할 수 있다.

 

이걸 응용해 우리가 만들고 있는 main.js에 적용해 보자.

 

6) 뭔진 모르겠지만 path 변수에 path라는 모듈을 요청해 담는다.

 

 

사용자로부터 경로가 들어오는 모든 곳에 내용을 바꿔줘야한다.

사용자가 입력한 정보 외부에서 들어온 정보와 우리가 코드로 짠 정보가 아니라 외부에서 들어온 정보가 바깥으로 나갈때 모두 오염될 수 있다.

이 모든것들은 철저히 의심해야한다.

28) 의 내용을 추가.

    오염된 정보, 걸러야 할 정보이기 때문에 변수명을 filtered라고 했다.

    filteredId에는 ..

    

29) `data/${    }` 중괄호 안의 내용을 filteredId로 변경해준다.

다시 url을 수정하여 ../password.js에 접근해 보았더니 파일을 찾을 수 없다는 undefined만 뜨게 된다.

filteredId의 값을 콘솔로 출력해 보니 password.js만 출력된다.

 

다른 readFile 부분의 경로를 모두 수정해 줘야 한다.

 

그리고 delete_process 조건 부분에서

삭제하는 경로를 id값으로 주는데

 

131) 들어오는 id값을 받고 .base로 경로를 세탁해준다.

132) 그리고 경로 부분 `data/${  } 이부분에 filteredId를 넣어준다.

Comments