210723 보안

박혜리·2021년 7월 23일
0

nodejs

목록 보기
12/13

이전에 프로젝트를 진행하면서 보안에 대한 지식이 전무해 여러 실수를 저지르는 바람에 꼭 똑띠 들어야겠다고 생각한 파트

입력정보에 대한 보안

잘못된 정보를 입력하는 경우
사용자의 아이디와 비밀번호를 모듈화 해서 상위 폴더 안 password.js라는 파일DB에 저장해둔다고 했을 때, 잘못하면 사용자가 임의로 id=../password.js를 입력해 페이지를 로딩할 수 있다. 얼마든지 경로를 조작해서 정보가 노출될 수 있다는 뜻.

경로에 대한 정보 노출을 막기 위해 parsing을 사용한다.
외부 사용자가 id 뒤의 값으로 ../password.js를 입력하여 접근했을 때의 경로를 parsing하면 아래와 같다.

var path = require('path');
var filterdId = path.parse(queryData.id);
console.log(fileterdId);

{ root: '',
dir: '..',
base: 'password.js',
ext: '.js',
name: 'password' }
console.log로 출력해보면, 이러한 객체가 출력된다.

여기서 우리는 경로에 대한 접근은 막고, 꼭 필요한 파일명만 사용하기 위해 base 만 뽑아서 사용해야 한다.

var path = require('path');
var filterdId = path.parse(queryData.id).base;

fs.readFile(`data/${filterdId}`, 'utf8', (err, description)=>{}

id 뒤에 넘어오는 값으로 파일을 읽어오는 처리를 수행할때, 경로를 변경하지 못하게 파일명으로만 접근할 수 있게 된다. 사용자가 아무리 data/?id=../password.js라고 친다고 해도, data 파일 내에 password.js 파일이 있는 경우가 아니면 내용이 보이지 않을 것(undefined)이다.

출력정보에 대한 보안

잘못된 정보가 넘어오는 경우

만약 사용자가 description 부분에 이렇게 입력했다면

<script>
	location.href='http://opentutorials.org/course/1';
</script>

script 태그가 페이지에 적용되어, 사용자가 이 게시물을 클릭한다면 사용자를 이 주소로 보내버린다. (이런걸 XSS라고 한다) 이러한 경우를 방지하기 위해 우리는 정보에서 문제가 될 수 있을만한 것들을 필터링 해야할 필요가 있다.

XSS란
cross-site scripting
크로스 사이트 스크립팅 (또는 사이트 간 스크립팅). 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 사용자가 웹페이지에 악성 스크립트를 삽입할수 있는 취약점이다.

  • script 태그를 모두 지워버리기

  • script를 실행하지 않고 바로 웹브라우저에 표시하기

  • sanitize html
    https://www.npmjs.com/package/sanitize-html

    <script>,<a> 등등 기타 태그들을 변환시켜 악성스크립트로 변질되는 것을 막아주는 보안 라이브러리다.

    사용방법:

  1. cmd 창에 npm init을 실행
  2. 전부 엔터를 친다.
  3. package.json 파일이 생긴 것을 확인
  4. npm install -S sanitize-html
var sanitizeHtml = require('sanitize-html');

var sanitizedTitle = sanitizeHtml(title);
var sanitizedDescription = sanitizeHtml(description, {
   allowedTags:['h1']  //h1 태그를 허용한다.
});
var html = template.html(title, list, `<h2>${sanitizedTitle}</h2>${sanitizedDescription}`,
  `<a href="/create">create</a>
   <a href="/update?id=${sanitizedTitle}">update</a>
   <form action="process_delete" method="post">
   	<input type="hidden" name="id" value="${sanitizedTitle}">
   	<input type="submit" value="delete">
   </form>`);
  1. 완성!
profile
붙잡지 않으면 이 또한 지나가리라

0개의 댓글

관련 채용 정보