생활코딩/WEBn

[Node.js] 입출력 데이터의 보안 이슈

hayjo 2020. 9. 18. 17:57

[강의 출처] opentutorials.org/course/3332/21150

 

App - 입력 정보에 대한 보안 - 생활코딩

수업소개 입력정보와 관련해서 보안적으로 처리해야 할 이슈를 살펴보겠습니다.  강의 소스코드 main.js (변경사항) var http = require('http'); var fs = require('fs'); var url = require('url'); var qs = require('queryst

opentutorials.org


입력정보 보안

데이터 저장 형태와 아래와 같다고 할 때,

directory
    /data
        /data1
        /data2
        /data3
    /main.js
    /password.js

URL에 ?id=../password.js와 같은 쿼리스트링을 입력함으로써 해당 정보에 접근 가능하다.

 fs.readFile(`data/${queryData.id}`, `utf8`, function(){});

이런 이슈를 방지하기 위해 path.parse(data).base 같은 필터를 이용해 위험할 수 있는 .. 키워드 등을 차단하는 것이 좋다.

 

 

출력정보 보안

유저가 입력한 데이터를 필터링 없이 출력하게되면 아래처럼 악성코드에 노출될 수 있다.

html의 <script> 태그를 이용해 악성코드를 실행시키는 예시

이 경우 <script> 태그로 인해 내부의 코드가 실행되어, 해당 데이터 페이지에 접근하면 'Attack'이라는 경고창이 출력된다.

그외에도 location.href를 이용해 유해 사이트로 리다이렉트하거나 유저의 로그인 정보를 유출하는 등의 공격이 가능해진다.

 

따라서 유저 입력 데이터에서 <script> 태그 비활성화 같은 조치가 필요하다. 예제에서는 아래 모듈을 사용했다.

www.npmjs.com/package/sanitize-html

 

sanitize-html

Clean up user-submitted HTML, preserving whitelisted elements and whitelisted attributes on a per-element basis

www.npmjs.com

 

var sanitizeHtml = require('sanitize-html');

var data = `
TEXT1
<script>alert('Attack')</script>
TEXT2
<a href="https://www.google.com/">title</a>
TEXT3
<h1>Heading</h1>
TEXT4`;

var sanitizedData = sanitizeHtml(data);
console.log(sanitizedData); // TEXT1 TEXT2 title TEXT3
/* 웹브라우저로 html 파일을 로딩하면 title의 link는 정상 작동한다
 * h1 태그는 텍스트만 남는다(헤딩 효과 적용X)
 * 위의 설정은 디폴트값으로, 설정을 변경하고 싶으면 인자로 객체를 넘겨서 허용 범위를 직접 지정할 수도 있다 */