Poetry를 활용한 Python 프로젝트 관리
패키지 의존성 관리와 가상 환경 생성 및 관리를 위한 방법.
패키지 의존성 관리와 가상 환경 생성 및 관리를 위한 방법.
Argparse argparse를 이용하면 파이썬 스크립트 실행시 사용자 임의의 Argument값을 넘겨서 활용할 수 있다. 유용한 argparse에 대하여 간단한 예제 import argparse # 인자값을 받을 수 있는 인스턴스 생성 parser = argparse.ArgumentParser(description='사용법 테스트입니다.') # 입력받을 인자값 등록 parser.add_argument("-testArg", dest="testDest", help="python argparse.py -testArg={입력값} 형태로 입력하세요~") # 입력받은 인자값을 args에 저장 (type: namespace) args = parser.parse_args() if args.testDest: print("결과값: ", args.testDest) **사용예시 : ** » python argparseTest.py --help usage: argparseTest.py [-h] [-testArg TESTDEST] 사용법 테스트입니다. optional arguments: -h, --help show this help message and exit -testArg TESTDEST python argparse.py -testArg={입력값} 형태로 입력하세요~ 결과값 : » python argparseTest.py -testArg=123 결과값: 123`
venv(가상환경) 사용 이유 파이썬을 다루다보면 다양한 패키지들을 사용하게 된다. 그렇게, pip3 install {패키지명}을 무분별하게 사용하다보면 로컬에 있는 다른 프로젝트 간 패키지 버전 충돌 혹은 패키지(라이브러리)간 의존성 문제가 발생하기도 한다. 이를 해결하기 위해 ‘venv’라는 파이썬 모듈로 패키지 환경 분리가 가능하며, 작업환경이 바뀌더라도 필요한 패키지들을 동일한 버전으로 설치해 작업할 수도 있다. 현재 설치되어있는 파이썬 패키지 목록 확인 pip list 가상환경 생성 python -m venv myenv venv 라는 모듈을 사용하겠다는 의미 myenv는 사용자 임의의 가상환경 별칭 ...
❓Injetion : 보안 취약점을 이용하여, 임의의 SQL 문을 주입하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위 ** 📜 Content** 🗡️ Injection 공격 예시 /* 어떠한 POST방식 API에 아래와 같은 인자값을 넘기는 것이 정상적인 방법일 때*/ { testKey : "testValue" } /* 악의적인 사용자는 다음과 같이 인자값을 설정하여 쿼리를 조작할 수 있다. */ { testKey : "testValue' and '해킹'='해킹" } 위 인자값이 SQL Query에 적용될 때 정상적인 인자값을 넘겨받은 쿼리 select * from testTable where key = 'testValue' Injection 공격을 시도된 쿼리 select * from testTable where key = 'testValue' and '해킹'='해킹' 🛡️ python에 대한 injection 방어 코드 실무에서 사용된 DB 호출 코드 방식 (Injection 대응 전) import psycopg2 from psycopg2.extras import RealDictCursor # DB 연결 준비 conn = psycopg2.connect("dbname={} user={} host={} password={}".format(db_name, db_user, db_host, db_pass)) # DB 호출함수 선언 def fetch(conn, query): result = [] cursor = conn.cursor(cursor_factory=RealDictCursor) cursor.execute(query) # SQL 실행 # DB조회 결과값 담기 raw = cursor.fetchall() for line in raw: result.append(line) return result # SQL 쿼리 선언 query = "select pjt_no, item_type from testTable " query += "where pjt_no = '" + pjt_no + "' " query += "and item_type = '" + type_cd2 + "'" # DB 호출함수 실행 result = fetch(conn=conn, query=query) Injection 대응 (Type 1) import psycopg2 from psycopg2.extras import RealDictCursor # DB 연결 준비 conn = psycopg2.connect("dbname={} user={} host={} password={}".format(db_name, db_user, db_host, db_pass)) # DB 호출함수 선언 def fetch(conn, query, sql_arg): result = [] cursor = conn.cursor(cursor_factory=RealDictCursor) cursor.execute(query, sql_arg) # SQL 실행 # DB조회 결과값 담기 raw = cursor.fetchall() for line in raw: result.append(line) return result # SQL 쿼리 선언 query = "select pjt_no, item_type from testTable " query += "where pjt_no = %(pjt_no)s" query += "and item_type = %(item_type)s" sql_arg = { 'pjt_no' : pjt_no, 'item_type' : item_type, } # DB 호출함수 실행 result = fetch(conn=conn, query=query, sql_arg=sql_arg) Injection 대응 (Type 2) (딕셔너리 타입(X) → tuple 타입으로 넘기는 것도 가능) ...