SQL 정리

SQL INJECTION (SQL 인젝션 방지)

wanduek 2025. 4. 29. 23:03

SQL INJECTION이란?


SQL 인젝션(SQL Injection)

웹 애플리케이션에서 사용자 입력값을 제대로 검증하지 않고 SQL 쿼리에 포함시킬 때 발생하는 보안 취약점입니다. 공격자는 이를 악용해 데이터베이스를 임의로 조작하거나 민감한 정보를 탈취할 수 있습니다.

 

-- 로그인 쿼리 예시
SELECT * FROM users WHERE username = 'admin' AND password = '1234';

 

위 쿼리가 아래처럼 사용자 입력을 문자열로 그대로 받는 경우

 

username = 'admin' -- '
password = '아무거나'

 

그럼 최종 쿼리는 이렇게 변합니다

 

SELECT * FROM users WHERE username = 'admin' -- ' AND password = '아무거나';

 

--는 SQL 주석이라 이후는 무시되고, 결국 username = 'admin'만으로 로그인하게 됩니다.

 

또한 username = 'admin' OR '1'='1'로 하게된다면

 

SELECT 1 FROM users WHERE username = '1' OR '1'='1' AND password= '...';

이 쿼리는 다음과 같은 의미로 해석됩니다:

  • username = '1'는 무시되고
  • '1'='1'는 항상 참이기 때문에
  • 해당 조건을 만족하는 모든 유저들이 조회될 수 있습니다.

이게 바로 SQL 인젝션 공격입니다.

방어방법

 

  • Prepared Statement (PreparedQuery) 사용
    → SQL 쿼리를 사전에 컴파일하고, 변수만 바인딩해 실행
    → 예: Java의 PreparedStatement, Python의 cursor.execute("SELECT ... WHERE id = %s", [user_id])
  • ORM 사용
    → JPA, Hibernate, Django ORM 등은 기본적으로 SQL 인젝션에 안전
  • 입력 값 검증 및 필터링
    → 숫자만 필요한 곳엔 숫자만 받도록 제한
  • 최소 권한의 DB 계정 사용
    → 애플리케이션이 DB에 접근할 때, 꼭 필요한 권한만 부여

 

반응형