정의
- 웹 애플리케이션에서 Database에 Query로 명령시 입력된 정보의 유효성 검증을 하지 않아 개발자가 의도하지 않은 동적 Query를 생성하여 Database 정보를 열람하거나 조작할 수 있는 보안 취약점
query_result = mysql_query("SELECT name,email FROM user WHERE ID='$id' AND PASSWORD='$password'") if mysql_num_rows($query_result) == 0: $ 로그인 실패 else : $ 로그인 성공
- 만약 위의 $id 값이 '' OR '1'='1' -- 라면, '1'='1'을 통해 모두 참이 되고 --를 이후의 쿼리문은 전부 주석처리
- 결과적으로 "SELECT name,email FROM user"가 실행되고 보안상 노출되면 안되는 user 테이블의 모든 row가 조회
입력값 검증
정의
- 사용자가 입력한 값이 개발자가 의도한 값인지 검증하고, 의도하지 않은 입력값에 대해선 검증하고 차단
Django 입력값 검증
- Django에선 ORM을 사용하며 쿼리셋을 활용하기에 SQL Injection으로부터 보호 가능
#1 user = authenticate(username='dan', password='abcdefg') #2 users = User.objects.filter(email=user_email) #3 users - get_object_or_404(email=user_email)
저장 프로시저 사용
- 사용하고자 하는 Query에 미리 Query 형식을 지정하는 것. 지정된 형식이 아니면 Query가 실행되지 않아 SQL Injection 공격으로부터 방어 가능