Web Security

SQL Injection (SQLi)

꼰대코더 2025. 10. 30. 22:05

SQL 인젝션은 가장 오래되었으면서도 여전히 널리 발생하는 보안 취약점 중 하나입니다. 사용자가 입력하는 값에 악의적인 SQL 코드를 주입해 웹 애플리케이션의 데이터베이스 동작을 조작할 때 발생하며, 이를 통해 사용자 이름·비밀번호·금융 기록 같은 민감한 정보에 무단으로 접근할 수 있습니다. 더 나아가 데이터베이스의 내용을 수정하거나 삭제하는 등 시스템을 완전히 제어할 수 있는 심각한 결과를 초래할 수 있습니다.

 

SQL 인젝션은 어떻게 일어나나?

SQL 인젝션은 사용자 입력을 제대로 정제하지 않을 때 발생합니다. 웹 애플리케이션이 사용자로부터 받은 값을 검증·바인딩하지 않고 그대로 SQL 쿼리에 포함하면, 공격자는 그 입력값을 조작해 쿼리의 구조 자체를 바꿀 수 있습니다. 결과적으로 원하지 않는 조건이 추가되거나 인증 우회, 데이터 조회·변경 등이 일어나게 됩니다.

 

SQL 인젝션 샘플

로그인 Form

 

서버측 Database 로그인 유저 조회

username=사용자입력 유저명

password=사용자입력 패스워드

 

아래와 같이 위의 변수들을 이용해서 SQL 코드를 생성한다.

SELECT * FROM USERS WHERE username=$username and password=$password

 

위의 username 에  ' ' OR '1'='1' -- ' 을 입력한다면

SELECT * FROM USERS WHERE username= ' ' OR '1'='1' -- 

으로 SQL 코드가 구성된다.

여기서 문제는 OR가 논리 연산자로서 기능이 되고  '1'='1' 는 항상 TRUE 이므로 모든 유저들을 리턴 받게되는 위험이 있다.

 

SQL 인젝션 방어책

Prepared Statement(준비문)파라미터화된 쿼리는 사용자 입력을 반드시 데이터로만 취급하게 해서 입력값이 SQL 코드로 실행되는 것을 방지합니다. 쿼리 안에 값 자리표시자(플레이스홀더)를 두고, 실제 값은 별도로 바인딩해 전달하기 때문에 ' ; 같은 문자가 쿼리의 구조를 바꾸지 못합니다. 실무에서는 SQL 인젝션을 막는 가장 기본적이고 강력한 방법으로 권장됩니다.

 

파이션의 psycopg2

 
  # 안전한 파라미터화 예시 (psycopg2)
  cur.execute("SELECT * FROM users WHERE id = %s", (user_id,))

 

위와같이 하면 입력이 ' ' OR '1'='1' -- ' 라도 OR 도 SQL쿼리의 연산자가 아닌 단순한 id 의 일부로서 처리된다.

'Web Security' 카테고리의 다른 글

XSS 방지책 (Express.js)  (0) 2025.12.02
XSS 방지책 (Flask)  (0) 2025.12.02
XSS 방지책 (ReactJS)  (0) 2025.12.02
CSRF (Cross-Site Request Forgery) attack  (0) 2025.12.02
크로스 사이트 스크립팅 (Cross-Site Scripting, XSS)  (0) 2025.11.30