SQL Injection

박효상·2022년 6월 7일
0

MySQL

목록 보기
3/6
post-thumbnail

SQL Injection이란?

정의

  • 웹 애플리케이션에서 Database에 Query로 명령시 입력된 정보의 유효성 검증을 하지 않아 개발자가 의도하지 않은 동적 Query를 생성하여 Database 정보를 열람하거나 조작할 수 있는 보안 취약점

SQL Injection 예시

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 공격으로부터 방어 가능
profile
집념의 백엔드 개발자

0개의 댓글