본문으로 바로가기

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