Flask RestAPI 요청 수신 2번째 파트로,
들어오는 요청 인자에 대해서 정규표현식을 이용한 파라미터 체크 방법에 대해 기술한다,
* 정규표현식이란, 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어다.
보안 취약점을 어느정도 막을 수 있는 방법은 입력 파라미터에 대한 체크를 하는 것으로
특히 서버로 들어오는 입력 파라미터에 대해서는 정해진 형식이 아니면 무조건 막아야 한다.
ex. 입력 파라미터가 숫자 6자리라면, 숫자 6자리가 아니면 배제 / 숫자가 아니면 배제 등의 처리가 필요하며
그러한 처리를 정규표현식을 사용해서 형식을 체크할 수 있다.
[main.py]
Flask POST 요청 수신 시, 요청 인자(파라미터)에 대해 유효성 검사(빈값, 공백, 데이터 형식 체크)를 한다.
# -*- coding:utf-8 -*-
from flask import Flask
from flask_restful import Api, Resource, reqparse
# 다른 파이썬 파일 함수 가져오기
from FlaskRestUtil import validateValue1, validateValue2
class TEST(Resource):
# POST 요청만 수신
def post(self):
try:
# 1. 인자값 수신
parser = reqparse.RequestParser()
# type={함수}
parser.add_argument('value1', required=True, type=validateValue1, help='value 1')
parser.add_argument('value2', required=True, type=validateValue2, help='value 2')
# 파서가 정의하지 않은 인수 포함 시, 400 Error 발생
args = parser.parse_args(strict=True)
# 결과 반환
return {'result': args['value1']}
except Exception as e:
app.logger.error(e)
return {'error': str(e)}
# Rest URL 정의 + application 객체 생성
app = Flask('APP')
api = Api(app)
api.add_resource(TEST, '/test')
if __name__ == '__main__':
# 0. 서버 실행
app.run(host='0.0.0.0', port=8000, debug=True)
[FlaskRestUtil.py]
웹, 함수 등 입력 파라미터에 대한 체크를 기본으로 한다.
특히 웹에서 들어오는 파라미터에 대해서는 형식 체크까지 해야 보안 취약점을 어느 정도 막을 수 있다.
> import re: 정규 표현식 사용
> 요청 수신 인자 (value 1): 요청 인자 수신 시, 숫자만 허용하도록
> 요청 수신 인자 (value 2): 요청 인자 수신 시, 숫자와 문자 최대 4자리 만 허용하도록
# -*- coding:utf-8 -*-
import re
# 요청 데이터 검증 - value 1
def validateValue1(s):
"""
:param s: 분석 요청 받은 value 1
:return 검증된 value1
"""
print(s)
# 빈 값 확인
if not s:
raise Exception("## Received Data must not be empty String")
else:
# 정규 표현식 사용 [숫자가 아닌 것 추출]
p = re.compile("[^0-9]")
# 숫자가 아닌 것이 존재하면 에러 / 존재하지 않으면 정상
if p.findall(s):
raise Exception("## value1 is out of format")
return s
# 요청 데이터 검증 - value 2
def validateValue2(s):
"""
:param s: 분석 요청 받은 value 2
:return 검증된 valu2
"""
print(s)
if not s:
raise Exception("## Received Data must not be empty String")
else:
# 정규 표현식 사용 [숫자, 문자가 섞은 최대 4자리 추출]
p = re.compile("[A-Z,0-9]{4}")
# 숫자, 문자가 아니면 에러 발생
if p.findall(s):
raise Exception("## value2 is out of format")
return s
[POST 요청]
http://localhost:8000/test?&value1=222&value2=c2#cx
> value1은 숫자만 넣어야 에러가 발생 x
> value2는 숫자, 문자만 허용하기 때문에 위와 같을 때, c2만 들어오게 된다.
[정규표현식 번외]
ex. 000000-1111111 (주민 번호)
> re.compile("(\d{6}[_]\d{7})")
: \d 숫자만 {6} 6자리
ex. Rank-A / Rank-B / Rank-C
> re.compile('"\w{4}[-][A,B,C]")
: \w 문자열
: [A,B,C] A, B, C 문자만 허용
'Computer Science > Python' 카테고리의 다른 글
# python Excel에 쓰기 (0) | 2020.09.13 |
---|---|
# Rest API Flask - 기동 및 요청 수신 (0) | 2020.09.13 |
# configuration 파일 생성 및 사용 (0) | 2020.09.12 |