목표
사용자로부터 서버로 어떠한 입력을 받을때에 발생할 수 있는 보안 위험을 방지하는 법을 알아보겠습니다.
> 상황 가정
입력에 의한 보안 위협이 어떤식으로 발생하는지 알아보기 위해 특정 상황을 가정해 설명해보겠습니다.
어떤 웹 애플리케이션 이 있습니다.
사용자로부터 파일 제목을 입력받으면 정해진 디렉토리 안에 있는 파일의 내용을 표시해주는 어떤 웹 애플리케이션.
이런 디렉토리 트리를 가지고 있구요.
security, data 디렉토리를 갖고있고, main.js 로 실행합니다.
이 어떤 웹 애플리케이션 은 사용자로부터 파일 제목을 입력받으면 data/
디렉토리 안에 있는 파일의 내용을 표시해줍니다.
그런데 이 어떤 웹 애플리케이션 은 사용자 정보를 담은 중요한 파일도 갖고 있습니다.security/users.txt
1 | --- 사용자들의 ID/PW 가 담긴 파일 --- |
이렇게 security/
디렉토리에 users.txt
파일의 형태로 사용자들의 ID/PW 가 저장되어 있다고 해봅시다.
(여기에 제목을 입력하면 내용을 불러와줍니다…)
그런데 만약 여기서 악의적 사용자가 정상적인 제목을 입력하지 않고,
`../security/users.txt`
라고 입력하게 되면 어떻게 될까요?
..
는 상위 디렉토리를 의미하기 때문에 data/../security/users.txt
로 users.txt 파일에 바로 접근할 수 있게됩니다.
(관리자가 원치 않는 데이터도 노출 될 수 있습니다.)
> 해결 방법
이러한 보안 취약점은 사용자로부터 받는 입력 코드를 필터링함으로써 해결 할 수 있습니다.
Node.js 가 제공하는 모듈 중, path
모듈을 이용해 입력 코드를 필터링 해 보겠습니다.
dirty.js
1 | var path = require('path'); |
`결과창`
1 | $ node dirty.js |
이렇게 path 모듈의 parse 메소드를 이용하면
root, dir, base, ext, name 으로 입력값을 잘라서 다룰 수 있습니다.
이를 이용해 오염된 input(dirty_input) 을 필터링해 악의적인 입력 코드를 걸러낼 수 있게 됩니다.
> Node.js 기초 공부 끝
이번 포스트를 끝으로 Node.js 기초편은 끝이 났습니다.
앞선 포스트들은 오픈튜토리얼스(https://opentutorials.org) 의 생활코딩 - Node.js 강의를 통해 공부한 내용을 정리하기 위해 작성되었습니다.