본문 바로가기
Programming/Node.js

[Node.js] node.js에서 mysql 사용 시 escape 사용하는 방법 (feat. sql injection)

by 코딩의성지 2020. 1. 3.

하이 ~~!! 오랜만에 포스팅한다 .. ㅎㅎ

 

요즘 디자인 공부에 살짝 빠져서 .. ㅎㅎ 앱디자인 중인데 !! 앱이 완성되면 여기 블로그를 통해 공개하도록하겠다 !

 

자자 .. 아무튼 오늘은 .. ㅎㅎ nodejs에서 mysql을 사용할 때 escape를 사용하는 방법을 포스팅해볼거다.

 

오늘은 아래의 링크에서 자료를 참조했다.

https://github.com/mysqljs/mysql#escaping-query-values

 

mysqljs/mysql

A pure node.js JavaScript Client implementing the MySQL protocol. - mysqljs/mysql

github.com

 

먼저 escape가 뭔지 부터 알아보자. 

 

escape

 

간단하게 말해서 escape는 데이터를 전달할 때 문자열을 인코딩하는 걸 말한다.

mysql 을 사용할때, mysql에서는 query string 을 통해 db로 데이터를 전달하는데, 이 때에도 스트링을 escape 해줄 필요가 있다. 그렇다면 왜 해줘야할까?

 

그것은 바로바로 sql injection이란 녀석을 방지해주기 위함이다. 그럼 sql injection 이란 무엇일까?

 

sql injection

 

그럼 sql injection 이란 무엇일까? 보안 관련 포스팅하는 시간은 아니니 간단하게 무엇인지만 얘기하고 넘어가도록 하겠다. sql injection 이란 웹에서 사용되는 해킹 기법 중 하나이다. 웹 애플리케이션의 back ground 에 있는 DB 에 쿼리를 날릴 때, 해커는 이 쿼리에다 악의적인 의도를 가지는 구문을 삽입하여 날린다. 이 공격방법을 바로 SQL Injection 이라고 한다. 이걸 방지하기위해 escape 함수나 parpared statement를 사용한다. 오늘은 escape에 대해 제대로 공부해보자.

 

escape 예제

 

먼저 id 값을 통해 user_tb 테이블에서 유저를 조회하는 sql을 escape 함수를 이용해 쿼리를 날리는 것을 만든 예제이다.

1
2
3
4
5
6
var id = 'banker';
var select_sql = 'SELECT * FROM user_tb WHERE id = ' + connection.escape(id);
connection.query(select_sql, function (error, results, fields) {
  if (error) throw error;
  // ...
});
 

코드를 보면 escape 함수를 통해 id 값을 인코딩한 것을 볼 수 있다.

 

 

 

또 , 아래의 코드 처럼 ? 를 이용해서 escape 할 수도 있다.

1
2
3
4
connection.query('SELECT * FROM user_tb WHERE id = ?', [id], function (error, results, fields) {
  if (error) throw error;
  // ...
});
 

 

 

 

그리고 두개 이상을 escape 시켜야할 때는 , 아래의 코드처럼 넣어 주면된다.

1
2
3
4
5
6
7
var id = 'banker';
var password = '1234';
var new_password = '4321';
connection.query('UPDATE user_tb SET password = ? WHERE id = ?, password = ?', [new_password, id, password], function (error, results, fields) {
  if (error) throw error;
  // ...
});
s

 

 

 

그리고 보통 db 사용은 post 나 get 방식으로 요청이 들어올 때, 처리되는게 일반적인데, post 방식으로 들어온 값을 sql에서 처리하는 예제도 한 번 작성해보겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
router.post('/join'function(req, res) {
    //var body = req.body;
    var id = req.body.id;
    var password = req.body.password;
 
    var sql = {id : id, password: password}
    var query =  conn.query('insert into user_tb set ?' , sql, function(err,rows) {
        if (err) {
            throw err;
        }
        console.log("insert ok");
    })
});
 

이런식으로 사용하면 된다. !! 다들 위의 예제를 바탕으로 자신만의 api 서비스를 만들어 보도록하자 ㅎㅎ

그럼 .. 오늘도 즐거운 코딩하자 !! ㅎㅎ

반응형

댓글