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에 접근할 때, 꼭 필요한 권한만 부여
반응형