IT/앱사용방법

시큐어코딩) 파이썬 SQL 인젝션 공격 예방코드 기초

볼통통알파카 2022. 5. 19. 22:14
반응형

SQL 인젝션 알고 가기

공격자가 글 쓰는 폼이나 URL에서 입력에 SQL문을 삽입해 DB에 직접 정보를 열람하거나 데이터를 조작하는 공격

 

SQL 인젝션 공격 원리

웹과 DB가 서로 통신하는 부분에 공격자가 임의의 SQL문을 삽입함

예) 로그인할 때 파라미터 값을 where = '1' or '1'과 같은 모든 값이 참으로 바뀌게 하여 로그인 우회

 

반응형

파이썬에서 SQL 인젝션 예방

외부에서 들어오는 입력 값을 매개변수로 받아 저장하고 매개변수 값을 실행 함수에서 바인딩하여 변수로 호출함.

 

시큐어 코딩이 적용되지 않은 소스
with dbconn.cursor() as curs:
# name, id값을 입력받음
     name = request.POST.get('name', '')
     id = request.POST.get('id', '')

# 사용자의 입력값 그대로 쿼리문 생성
  sql_query = "update board set name='" + name + "' where id='“ + id + "'"
  curs.execute(sql_query)

코드 설명

매개변수로 변환하지 않고 사용자 입력값을 그대로 받아 입력하였다.

또한 execute 함수에서 바인딩을 따로 하지 않고 그대로 문법을 받았다.

이 경우 사용자 이름과 아이디를 쿼리문으로 작성할 때 문법이 적용된다.

 

시큐어 코딩 적용한 소스
with dbconn.cursor() as curs:
 name = request.POST.get('name', '')
 id = request.POST.get('id', '')

 # 외부 입력값을 안전한 매개변수로 변환받아 된 쿼리를 생성 한다
 sql_query = 'update board set name= %s where id = %s'

 # 사용자의 입력 값을 매개변수로 받은 쿼리에 바인딩[name, id] 하여 실행되므로 안전하다
 curs.execute(sql_query, (name, id))

코드 설명

매개변수 %s 로 name과 id 값을 String 형으로 받았다.

또한 execute 함수에서 매개 변숫값을 바인딩해서 호출했다.

이 경우 사용자 이름과 아이디를 문자열로 묶어 입력되므로 쿼리문으로 인식되지 않는다.

select * from table이란 쿼리문을 'select * from table' 따옴표로 문자로 인식하게 한 경우라고 이해하면 된다.

 

파이썬 시큐어코딩 정리

1. 외부 입력 매개변수로 변환 후 호출

2. 실행 함수에서 매개변수값을 바인딩하여 특정 값만 인식되게 함

반응형