본문 바로가기
Web Security/SecureCoding

JS) SQL 삽입

by KkingKkang 2023. 2. 24.

소프트웨어 개발보안

보안 위협에 대응할 수 있는 소프트웨어를 개발하기 위한 일련의 보안 활동으로, 소프트웨어 개발 생명주기(SDLC)의 각 단계별로 요구되는 보안활동을 수행하는 것을 의미한다. 

SQL 삽입

데이터베이스와 연동된 웹 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 및 URL 입력란에 SQL 문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안약점을 말한다. 

자바스크립트에서는 관계형 데이터베이스, NoSQL등 다양한 유형의 데이터베이스 시스템과 상호작용할 수 있는 라이브러리를 제공한다. 

- 데이터베이스 드라이버 : 클라이언트와 커넥터를 사용해 데이터베이스와 직접 상호작용 (mysql)
 개발자가 직접 쿼리 문자열을 정의하고, 그 결과를 그대로 데이터베이스에 질의하게 되는데 이 경우 검증되지 않은 외부의 입력값으로 인한 SQL 삽입 공격이 발생할 수 있음
 인자화된 쿼리를 통해 외부 입력값을 바인딩해서 사용하면 SQL 인젝션 방어 가능 

- 쿼리 빌더 : 데이터베이스 클라이언트보다 한 단계 높은 계층에서 동작하며, 자바스크립트 코드로 쿼리 데이터를 생성하고 데이터베이스와 상호작용 할 수 있음 (Knex.js)
SQL 인젝션 공격을 방어할 수 있음
화이트리스트 기반 방식, 특수 문자나 복잡한 동적 쿼리는 필터링 규칙 변경 필요 

- ORM(Object Relational Mapping) : 개발자가 데이터베이스를 추상화된 객체 형식으로 다룰 수 있게 해주는 데이터베이스 툴킷 (Sequelize)
 ORM에서 지원하는 원시 쿼리 기능을 사용하면 공격에 취약해질 수 있음
 인자화된 쿼리를 통해 외부 입력값을 바인딩해서 사용하면 SQL 인젝션 방어 가능 

인자화된 쿼리는 사용자가 전달한 입력값을 그대로 쿼리 문자열로 만들지 않고, DB API에서 제공하는 기능을 사용해 쿼리 내에 사용자 입력값을 구성하는 방법을 의미한다. 

 

반응형

댓글