Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#29] subprocess로 코드 실행 #32

Merged
merged 10 commits into from
Nov 4, 2024
Merged

[#29] subprocess로 코드 실행 #32

merged 10 commits into from
Nov 4, 2024

Conversation

ujkkk
Copy link
Contributor

@ujkkk ujkkk commented Nov 1, 2024

#️⃣ 연관된 이슈

📝 작업 내용

  • 기존 restrictedpytho, flsk8 코드 지우고 subprocess에서 코드 실행

스크린샷 (선택)

틀린 문법 시

  • Traceback 통해서 더 자세한 에러 내용 (flsk8로 행, 열 정보를 주는 것보다 Traceback 포함한 정보가 더 친절한 것 같아서 바꿈)
image

또한 이제 코드들이 거의 다 돌아감. 저번에 안됐던 함수안에 Print 해도 결과 잘 받아옴

💬 리뷰 요구사항(선택)

  • 아래 공부한 내용 남겨놨어요 읽어보면 좋을 듯 해요~

@ujkkk ujkkk added the BE label Nov 1, 2024
@ujkkk ujkkk requested review from seroak and SongGwanSeok November 1, 2024 06:07
@ujkkk ujkkk self-assigned this Nov 1, 2024
@ujkkk
Copy link
Contributor Author

ujkkk commented Nov 1, 2024

Python SubPorocess

Subprocess란?

subprocess 모듈은 새로운 프로세스를 생성하고, 그들의 입력/출력/에러 파이프에 연결하고, 반환 코드를 얻을 수 있도록 합니다. 이 모듈은 몇 가지 이전 모듈과 함수를 대체하려고 합니다:

사용하기

권장되는 접근법은 처리할 수 있는 모든 사용 사례에 run() 함수를 사용
image 3

  • input : 입력값 넣어줄 수 있음. \n으로 구별 됨
stdin의 경우, 입력의 줄 종료 문자 '\n'이 기본 줄 구분자 os.linesep으로 변환됩니다. stdout과 stderr의 경우, 출력의 모든 줄 종료가 '\n'으로 변환됩니다. 자세한 정보는 생성자에 대한 newline 인자가 None일 때에 관한 io.TextIOWrapper 클래스의 설명서를 참조하십시오.
  • cpature_output : 출력 결과를 받는다고 설정

CalledProcessError

image 2
  • 리턴코드가 0이 아닐 때 터짐

stdout을 설정할 때 subprocess.PIPE와 subprocess.STDOUT 차이

subprocess.PIPE

  • stdout과 stderr를 다른 스트림에서 처리

subprocess.STDOUT

  • stdout과 stderr를 동일 스트림에서 처리

capture_output을 true로 설정하면 PIPE로 설정 됨

subprocess에서 코드를 실행하는 것이랑 exec()로 코드를 실행하는 것의 차이

보안적 측면으로 차이가 크다.

1.subprocess로 코드 실행

subprocess 모듈을 사용하면 외부 프로세스를 생성하여 독립된 환경에서 Python 코드를 실행 가능

장점

  • 격리성: subprocess는 별도의 프로세스에서 실행되기 때문에, 메인 프로세스와 독립적입니다. 메모리, 변수, 스택 등이 별개로 관리되므로 메인 프로그램의 환경에 영향을 미치지 않습니다.
  • 보안성: 메인 프로세스와 격리되어 있어, 코드 실행 중 발생하는 예기치 못한 오류나 공격으로부터 메인 프로세스를 보호할 수 있습니다. 예를 들어, subprocess에서 실행된 코드가 메인 프로세스의 변수나 함수에 직접 접근하는 것은 불가능합니다.
  • 타임아웃: subprocess는 실행 시간에 타임아웃을 설정할 수 있어, 무한루프나 장시간 걸리는 실행을 방지할 수 있습니다.
  • 다양한 언어 지원: subprocess는 Python 외의 명령어도 실행할 수 있어, 다른 언어의 코드나 시스템 명령을 실행하기에 적합합니다.

단점

  • 추가적인 리소스 소비: 별도의 프로세스를 생성하므로 메모리와 CPU를 추가로 소비합니다. 대량의 코드 실행이 필요한 경우에는 시스템 리소스에 부하를 줄 수 있습니다.
  • 입출력 처리의 복잡성: 프로세스 간 통신을 위해 표준 입출력(stdout, stderr)을 설정하고 데이터를 송수신해야 하므로 코드가 복잡해질 수 있습니다.

2.exec()로 코드 실행

exec()는 문자열 형태의 Python 코드를 현재 Python 프로세스 내에서 바로 실행하는 함수입니다. 코드 블록을 포함한 Python 구문을 실행할 수 있습니다.

장점

  • 빠른 실행: 별도의 프로세스 없이 현재 프로세스 내에서 바로 코드를 실행하므로 리소스 소비가 적고 실행 속도가 빠릅니다.
  • 간편한 사용: 외부 프로세스 생성이나 입출력 처리 없이 Python 코드 자체를 바로 실행할 수 있어 간단히 사용할 수 있습니다.
  • 메모리 공유: 메인 프로세스의 변수와 함수에 바로 접근할 수 있어, 전역 변수나 함수의 수정 및 접근이 가능합니다.

단점

  • 보안 취약점: exec()는 현재 프로세스에서 바로 실행되므로, 코드에 대한 제어가 어려워 보안에 매우 취약합니다. 사용자가 악의적인 코드를 작성하면 메인 프로세스의 환경을 쉽게 조작할 수 있습니다. 예를 들어 exec() 내에서 중요한 파일을 삭제하거나, 시스템 명령을 실행할 수 있습니다.
  • 메모리 오염: exec()는 현재 프로세스의 메모리, 변수 공간을 직접 사용하므로, 실행된 코드가 메인 프로세스의 변수와 상태에 영향을 미칠 수 있습니다. 예를 들어, 전역 변수를 변경하거나 새로운 함수를 정의하는 등 메모리를 오염시킬 가능성이 있습니다.
  • 타임아웃 설정 불가: exec()로 실행된 코드는 기본적으로 타임아웃을 설정할 수 없으므로, 무한루프나 장시간의 실행을 제한하기 어렵습니다.
image 4

Copy link
Member

@SongGwanSeok SongGwanSeok left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이전 코드에 비해 훨씬 깔끔하고 좋네요~~ 잘 바꾼 것 같아요~



# Response 로깅 미들웨어
# # Response 로깅 미들웨어
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주석이 하나 더 생겼네요

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수정했습니다!

@ujkkk ujkkk merged commit b2bdc35 into develop Nov 4, 2024
1 check passed
@ujkkk ujkkk deleted the feature/issue29 branch November 4, 2024 05:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feat] 사용자 코드 실행을 subprocess 이용해서 수행
2 participants