개발햄비

[node.js] 입력정보 보안 처리 본문

개발/node.js

[node.js] 입력정보 보안 처리

개발햄 2019. 2. 2. 22:36


홈페이지에서 댓글이나 게시물을 작성할 때 사용자가


라는 식으로 스크립트 태그를 넣을 수 있다

이렇게 되면 작성된 스크립트 태그에 의해서 alert가 작동되게 되는데 이걸 이용하여

유저의 정보를 빼가거나 , 링크를 걸어 악의적으로 홈페이지 이동을 만들 수 있다


이 때 방법은 2가지가 있다

1. 하나는 script 태그를 완전히 지우는 방법과

2. 또 다른 하나는 < > 태그를 entity code로 전환해주는 것이다.


같이 변환시켜 주면 스크립트가 적용되지 않고 그대로 본문에

가 출력되는 것을 볼 수 있다. 


참고자료 


ResultDescriptionEntity NameEntity Number
non-breaking space&nbsp;&#160;
<less than&lt;&#60;
>greater than&gt;&#62;
&ampersand&amp;&#38;
"double quotation mark&quot;&#34;
'single quotation mark (apostrophe)&apos;&#39;
¢cent&cent;&#162;
£pound&pound;&#163;
¥yen&yen;&#165;
euro&euro;&#8364;
©copyright&copy;&#169;
®registered trademark&reg;&#174;




하지만 이런걸 손으로 작성하기엔 너무 무리이기 때문에


npm sanitize-html 라는 보안 모듈이 있다


커맨드 창에


npm init 을 실행 

-> 나의 에플리케이션을 npm으로 관리하기 위한 절차를 시작


그 후 엔터를 쭉 누르고 쭉 넘어가면 package.json이 생성되고 프로젝트에 관한 정보를이 생성된다


그 후 다시


 npm install -S sanitize-html 를 입력한다 

(-S를 선언하면 내가 진행하고 있는 프로젝트의 작은 부품으로 설치가 되고 -g를 하게 되면 

 컴퓨터 전역에서 사용할 수 있는 것이 설치가 된다.)


다운로드가 시작..


node_modules가 생성되고 여러가지 파일이 다운로드 받아지고

다시 

package.json에 


  "dependencies": {

    "sanitize-html": "^1.20.0"

  }


의존성이 추가된다 



sanitize-html 사용법



var sanitizeHtml = require('sanitize-html');
 
var dirty = 'some really tacky HTML';
var clean = sanitizeHtml(dirty);


위 sanitizeHtml 을 선언 후 


sanitizeHtml(inputData); 를 통해 오염된 데이터 ( 스크립트 선언 등) 를 살균하는 것이 가능하다.


sanitizeHtml를 통해 살균이 되면 <script > 는 강력하게 삭제가 된다 .


하지만 <p> 태그나 <h1>태그 같은 경우 완전히 지워지지는 않고 내용은 살려주게 되는데 태그는 


적용되지 않는다 . 이때 태그를 허용하는 방법이 있는데


clean = sanitizeHtml(dirty, {
  allowedTags: [ 'b', 'i', 'em', 'strong', 'a' ],
  allowedAttributes: {
    'a': [ 'href' ]
  },
  allowedIframeHostnames: ['www.youtube.com']
});

등과 같이 사용하는 것이 가능하다.



    var sanitizeData = sanitizeHtml( inputData ,{

              allowedTags: ['h1','p']

            });


allowedTags: ['h1','p']를 통해 허용할 수 있는 태그를 지정하게 되면 allowedTags: 안에 있는 태그는 작성할 수 있게 된다 .