song.log

[Node.js] 모듈의 형식&제작, 입력 정보/출력 정보에 대한보안 본문

DevLog/Node.js

[Node.js] 모듈의 형식&제작, 입력 정보/출력 정보에 대한보안

SingaKorean 2019. 12. 21. 21:36
반응형

 

1. 모듈의 형식

모듈은 그룹핑의 가장 큰 형태라고 볼 수 있음

 

모듈이 될 파일에 객체 하나를 작성

이 때, module.exports = '객체' 를 통해 다른 파일에서도 접근이 가능하도록 함

var M = {
  v: 'v',
  f: function(){
    console.log(this.v);
  }
};

module.exports = M;

 

이 객체에 접근하고자 하는 파일에서 require()를 통해 객체를 받아옴

같은 폴더 안에 있는 파일이기에 ./를 붙여서 가져오기

console.log('객체'); 를 통해 객체 안에 무엇이 있는지 확인할 수 있다.

var M = require('./mpart.js');

console.log(M);
M.f();

 

 

2. 모듈의 제작

제작했던 main.js app 에서 template 객체를 가지고 모듈화 하기

var template = {
  HTML:function(title, list, body, control){
    return `
    <!doctype html>
    <html>
    <head>
      <title>WEB1 - ${title}</title>
      <meta charset="utf-8">
    </head>
    <body>
      <h1><a href="/">WEB2</a></h1>
      ${list}
      ${control}
      ${body}
    </body>
    </html>
    `;
  },
  list: function(filelist){
    var list = '<ul>';
    var i = 0;
    while(i < filelist.length){
        list = list + `<a href='/?id=${filelist[i]}'><li>${filelist[i]}</li></a>`;
        i = i+1;
    }
    list = list + "</ul>";
    return list;
  }
}

module.exports = template;

main.js에 이 것만 추가.

var template = require('../lib/template.js');

 

3. 입력한 정보에 대한 보안

 

입력 정보가 들어있는 경로를 사용자들에게 보이지 않게 하기 위해, path.parse().base를 사용

경로를 탐색할 수 있는 내용을 세탁할 수 있다.

 

    var filteredId = path.parse(queryData.id).base;
        fs.readFile(`data/${filteredId}`, 'utf8', function(err, description){

 

 

3. 출력 정보에 대한 보안

html의 script태그 이용해서 다른 사이트로 이동하게 하거나, alert창을 띄우게 하는 나쁜 입력을 받았을 경우, 

 

이런식으로 문제가 생길 수 있다.

 

npm sanitize-html을 검색하고 npm 공식 사이트에서 다운로드 수를 체크하고 다운 받을 것

 윈도우키 + r > cmd 실행창 > npm init을 입력하면 우리의 npm을 package로 관리

- S는 프로젝트의 작은 부품으로 들어가는 듯한 느낌을 나타내는 것

 

package.json을 보면 어떠한 외부소프트웨어에 의존하고 있는지를 확인할 수 있다.

 

다운로드한 npm sanitize-html을 활용

 

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

sanitizeHtml('필터하기 위한 존재', {허용하는 태그:[]});

fs.readdir('./data', function(err, filelist){
          var filteredId = path.parse(queryData.id).base;
          fs.readFile(`data/${filteredId}`, 'utf8', function(err, description){
            var title = queryData.id;
            var sanitizedTitle = sanitizeHtml(title);
            var sanitizedDescription = sanitizeHtml(description,{
              allowedTags:['h1']
            });
            var list = template.list(filelist);
            var html = template.HTML(title, list,
              `<h2>${sanitizedTitle}</h2><p>${sanitizedDescription}</p>`,
            `<a href="/create">create</a>  <a href="/update?id=${sanitizedTitle}">update</a>
            <form action="/delete_process" method="post">
              <input type="hidden" name="id" value="${sanitizedTitle}">
              <input type="submit" value="delete">
            </form>
            `);

alert()를 적었지만
허용된 태그인 h1태그만 나오게 됨

 

페이지 소스에서도 없어짐

 

 

※ node.js awesome 이라고 검색하면 node.js의 유용한 module을 북마크한 것들을 찾아 볼 수 있다.

 

 

참조한 생활코딩 URL :

https://opentutorials.org/module/3549/21148

https://opentutorials.org/module/3549/21149

https://opentutorials.org/module/3549/21150

https://opentutorials.org/module/3549/21151

 

 

반응형
Comments