들어가기 앞서..
사실 DB에서의 SQL Injection이라기보단 Node.js에서의 SQL Injection이 맞는거같다.
DB는 데이터의 저장소이고, 이 저장소와의 데이터를 주고받는건 Node.js이기 때문이다.
이번 포스팅을 쓰게된 이유는 이번에 회사에서 더미시스템을 만들었었다.
앱과 서버구축, 그리고 DB를 만들고 테이블을 만들어 통신을 하는걸 만들었는데, 아직 고급기술은 사용하지도 못하고, Secure Coding도 하지를 못했다.
물론 서비스할 시스템이 아니었고, 자체적으로 원하는 동작을 하는지 테스트하기 위한 시스템이었지만, 간단한 보안을 생각하는 코딩을 하지 못했기 때문에 공부를 해보았다.
더미시스템인데 보안을 생각해야하나? 라고 생각할 수 도있지만, 한번 프로그램을 만들기 시작했으면 더미시스템이라도 완벽하게 구현을 하고싶은 개인적인 욕심이라 공부를 시작했다.
SQL Injection이란 ?
사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위이다.
sql문을 작성할때
SELECT * FROM 테이블명; |
이런식으로 작성을 하게된다. 위를 하나하나 해석해보면 검색한다.모든걸.테이블명에서. 이다.
테이블명은 과일이고, 그안에 사과,바나나,포도라는 데이터가 들어있을때
결과는 사과 바나나 포도가 나온다.
근데 여기서 ;을 쓰는 이유는 여기까지가 하나의 sql문이다~ 라고 표현할수도 있지만, 여러개의 sql문을 입력할때도 쓰인다.
SELECT * FROM 과일; UPDATE 과일 SET 사과=포도; |
이런식으로 작성이 가능하다. 편의상 ""은 사용하지 않았다.
사용자가 악의를 품고 자신이 원하는 데이터를 변경한다던가, 지운다던가, 검색하는등 sql문을 이용하여 자신이 원하는 데이터를 조작할수 있기 때문에 항상 조심해야한다.
그럼 SQL Injection공격을 막기위해서는 무엇을 해야할까?
node.js 코드중 일부를 보여주겠습니다.
var sql = 'INSERT INTO 과일 (빨간색, 노란색, 보라색) VALUES("사과", "바나나", "포도")'; conn.query(sql, function(err, rows, fields){ if(err) console.log(err); }); |
위와 같은 코드를 보면 평범하게 과일이라는 데이터베이스안에 사과,바나나,포도의 값을 차례대로 넣어주고있다.
같은 동작을 하는 다른 코드를 살펴보면
var sql = 'INSERT INTO topic (title, description, author) VALUES(?, ?, ?)'; var params = ['Supervisor', 'Watcher', 'graphittie']; conn.query(sql, params, function(err, rows, fields){ if(err) console.log(err); }); |
이 코드를 보면 글씨를 굵게 처리한부분이 바뀌었다.
분명 같은 동작을 하는 코드인데 왜 한줄이 추가되었을까?
이유는 SQL Injection에 대비하기 위함이다.
첫번째 방법처럼 하나하나 열거해주는 경우 사용자가 입력한 정보가 옳바르지 않다면 위험성이 커진다.
하지만 두번째 방법으로 하게되면
params가 하는 역할이 물음표에 들어갈 값을 배열의 순서대로 치환해주는 방식이다.
이렇게 되면 사용자가 입력하는 값에 옳바르지 않은 데이터가 포함이 되어있으면 그것을 안전하게 DB서버로 전송할수 있게하는 여러가지 처리를 해준다.
그런 역할을 해주기 때문에 ?를 사용하고, 그것을 파라미터로 전달하는 방법을 사용하면된다.
'Server > DataBase' 카테고리의 다른 글
[SQL 연습] SQL연습 사이트 -1 (0) | 2022.01.18 |
---|