티스토리 뷰

문제

ORM을 사용하지 않고, Raw Query로 데이터를 직접 호출하는 경우 SQL Injection과 같은 보안상의 문제가 발생할 수 있다.

SQL Injection 는 악의를 가진 사용자가 SQL를 조작하여 데이터베이스에 비정상적인 명령을 실행시켜 나타나는 공격을 말한다.

예를 들면, 전체 게시글을 조회하는 API 에서 페이지네이션을 위해 index나 검색어 같은 파라미터를 전달한다고 하면 아래와 같이 SQL 문을 작성할 것이다.

SELECT * FROM Boards WHERE title LIKE '%bar%';

bar 자리에 파라미터로 받은 값을 바로 넣어 사용하게 되면, 쉽게 데이터베이스 조작에 노출되기 때문에 조치가 필요하다.

 

 

 

해결

1) 파라미터 유효성 검사

쿼리스트링이나 Path Variable과 같은 파라미터에 유효성을 검증하는 로직을 추가한다.

특수문자 제약하는 등 정규표현식 또는 joi 등의 라이브러리를 사용할 수 있다.

 

 

2) ORM(Sequelize) - Replacements

1. :로 시작하는 이름 있는 파라미터 - 객체의 key에 해당하는 값이 대체됨

sequelize.query('SELECT * FROM projects WHERE status = :status', { replacements: { status: 'active' }, type: sequelize.QueryTypes.SELECT } )

2. ?로 표현하는 이름이 없는 파라미터 : 배열 [] 안의 값이 순서대로 대체됨

sequelize.query('SELECT * FROM projects WHERE status = ?', { replacements: ['active'], type: sequelize.QueryTypes.SELECT } )

 

참고자료

https://sequelize.org/v3/docs/raw-queries/#bind-parameter

How to prevent sql-injection in nodejs and sequelize?

 

댓글