이전에 프로젝트를 진행하면서 보안에 대한 지식이 전무해 여러 실수를 저지르는 바람에 꼭 똑띠 들어야겠다고 생각한 파트
잘못된 정보를 입력하는 경우
사용자의 아이디와 비밀번호를 모듈화 해서 상위 폴더 안 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>
등등 기타 태그들을 변환시켜 악성스크립트로 변질되는 것을 막아주는 보안 라이브러리다.
사용방법:
npm init
을 실행 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>`);