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

 

취약한 웹 어플리케이션에서는 사용자로부터 입력된 값을 필터링 과정없이 넘겨받아 동적 쿼리를 생성한다.

이는 개발자가 의도하지 않은 쿼리가 생성되어 정보유출에 악용될 수 있다.

 

📌 안전한 코딩기법

  • 외부 입력이나 외부 변수로부터 받은 값이 직접 SQL 함수의 인자로 전달되거나, 문자열 복사를 통하여 전달되는 것은 위험하다. 그러므로 인자화된 질의문을 사용해야 한다.
  • 외부 입력값을 그대로 사용해야 하는 환경이라면, 입력받은 값을 필터링을 통해 처리한 후 사용해야 한다. 필터링은 SQL문에서 사용하는 단어 사용 금지, 특수문자 사용금지, 길이 제한의 기준을 적용한다.

 

📌 예제

#include <stdlib.h>
#include <sql.h> 
void Sql_process(SQLHSTMT sqlh) 
{ 
    char *query = getenv("query_string"); 
    SQLExecDirect(sqlh, query, SQL_NTS);
}

 

위 코드를 살펴보자.

외부 입력이 SQL 질의어에 어떠한 처리도 없이 삽입되었기 때문에, name' OR 'a'='a 와 같은 문자열을 입력으로 주면

WHERE 절이 항상 참이 된다.

 

#include <sql.h> 
void Sql_process(SQLHSTMT sqlh) 
{ 
    char *query_items = "SELECT * FROM items"; 
    SQLExecDirect(sqlh, query_items, SQL_NTS);
}

 

위 코드는 인자화된 질의를 사용해 질의 구조의 변경을 막을 수 있다.

+ Recent posts