1 minute read

19. Node.js - App 제작 - 입력 정보에 대한 보안


Security 예

password.js 이 객체가 어플리케이션에서 해석되는 방법

module.export={
 id:'hello',
 password:'111'
}

main.js 에서 글 본문을 보여줄 때

fs.readFile(`../nodejs1/data/${queryData.id}`, 'utf8', function(err, description){
}

URL localhost:3000/?id=../password.js 로 접속하면 ../nodejs1/data/password 로 데이터 파일이 읽힌다.

이렇게 하면 module.exports 했던 파일의 정보가 페이지 소스를 통해 드러난다.

이런 문제가 생길 수 있기에 보안이 중요하다

  • ’../ 등의 위험할 수 있는 명령어를 차단하여 보안을 지킨다’
  • ‘서버의 경로 정보를 숨길 수 있다’
  • ‘입출력 항목 하나하나를 모두 통제’
  • ‘a라는 파일이 있는데 b라는 파일의 제목을 a로 바꾸면 a가 덮어쓰기 된다,
    a라는 파일이 있는데 추가로 a라는 파일을 생성할 때의 예외 처리 등등에 대한 보안’

nodejs path parse 구글링
Node.js 공식 API - path.parse(path) 메소드

  • path를 파싱해준다.

    path.parse('/home/user/dir/file.txt');
    // Returns:
    // { root: '/',
    //   dir: '/home/user/dir',
    //   base: 'file.txt',
    //   ext: '.txt',
    //   name: 'file' }
    

parse 에다가 인자를 주면, parse 메소드가 결과를 리턴한다.

password.js 파일에 대해 cmd node 콘솔

>node enter
var path = require('path');

>path.parse('../nodejs1/data/password.js'); enter

node 콘솔에서는 console.log()를 안해도 자동으로 결과를 출력해준다.

c:\_dev\_nodejs\web1>node
> var path=require('path');
undefined
> path.parse('../nodejs1/data/password.js');
{ root: '',
  dir: '../nodejs1/data',
  base: 'password.js',
  ext: '.js',
  name: 'password' }
>   

중괄호로 감싸진 객체.

> path.parse('../nodejs1/data/password.js').base;
'password.js'

경로를 탐색해나갈 수 있는 정보를 세탁할 수 있다.


main.js
var path = require('path');

사용자로부터 경로가 들어오는 모든 곳의 내용을 바꿔준다.

사용자가 입력한, 외부로부터 들어오는 정보와 우리가 코드로 짠 정보 뿐만 아니라
외부에서 들어온 정보가 밖으로 나갈 때 모두 신경써야 한다.

외부에서 들어온 정보란

fs.readFile(`../nodejs1/data/${queryData.id}`

readFile의 ${queryData.id} 이 부분이다.

문제가 있는 정보를 쳐내는 것을 filter라 한다

var filteredId = path.parse(queryData.id).base;

수정

fs.readFile(`../nodejs1/data/${filteredId}`, 'utf8', function(err, description){}

이렇게 하면 아까처럼 URI 경로를 localhost:3000/?id=../password.js
이렇게 해도 제목은 바뀌겠지만
경로의 ../ 부분이 차단되었기에 파일을 찾을 수 없다며 undefined가 뜬다.

다른 부분도 똑같이 수정한다.

삭제하는 경로에도 id값을 주기에 마찬가지로 수정해야 한다.

외부에서 정보가 들어오는 경우는 삭제

delete_process

var id=post.id;

var filteredId = path.parse(id).base;
들어온 id값을 받는다

fs.unlink(`../nodejs1/data/${id}`, function(error){
이 부분을 filteredId 로 수정한다.

fs.unlink(`../nodejs1/data/${filteredId}`, function(error){

사용자에게 시스템을 열어두면 안된다.