Flask 를 이용한 안전한 HTML 렌더링

PythonBeginner
지금 연습하기

소개

Flask 에서 HTML 을 반환할 때 (Flask 의 기본 응답 유형), 출력에 렌더링된 사용자가 제공한 모든 값은 주입 공격으로부터 보호하기 위해 이스케이프 처리되어야 합니다. 이 랩에서는 이를 달성하기 위해 escape를 사용하는 방법을 배우게 됩니다. 또한, 나중에 소개될 Jinja 로 렌더링된 HTML 템플릿은 이를 자동으로 수행합니다. 현재로서는 수동으로 escape를 사용하여 이 작업을 수행할 수 있습니다.

Escape (이스케이프)

이 단계에서는 주입 공격으로부터 보호하기 위해 escape를 사용하는 방법을 배우게 됩니다.

  1. html_escaping.py 파일을 열고 먼저 Flask 클래스와 escape를 import 합니다.
from flask import Flask
from markupsafe import escape
  1. 다음으로 Flask 클래스의 인스턴스를 생성합니다.
app = Flask(__name__)
  1. 그런 다음 route() 데코레이터를 사용하여 / 경로를 escaping이라는 뷰 함수와 함께 생성합니다. 이 함수 내에서 JavaScript 코드 조각을 정의하고 escape를 사용하여 텍스트로 렌더링하고, HTML 에서 특별한 의미를 갖는 모든 문자를 이스케이프 처리합니다.
@app.route('/')
def escaping():
    input = "<script>alert('XSS attack');</script>"
    escaped_input = escape(input)
    return f"User input: {escaped_input}"
  1. 디버그 모드를 활성화하여 포트 5000 에서 Flask 애플리케이션을 시작하기 위한 스크립트의 main 진입점을 생성합니다.
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. 애플리케이션을 실행하려면 먼저 다음 명령을 사용하여 터미널에서 Flask 애플리케이션을 실행합니다.
python3 html_escaping.py

그런 다음 인터페이스 상단에 있는 "Web 5000" 탭을 열고 페이지를 새로 고치면 다음 메시지가 표시됩니다.
XSS attack prevention example

  • <script> 태그는 JavaScript 로 실행되지 않고 텍스트로 안전하게 표시되어 XSS 공격 방지를 보여줍니다.

요약

이 랩에서는 입력을 수동으로 이스케이프 처리하기 위해 escape를 사용하는 방법을 배웠습니다. 이는 잠재적으로 유해한 공격을 처리할 때 매우 유용할 수 있습니다. 나중에 Jinja 로 템플릿을 렌더링하는 방법을 배우게 되는데, 이는 이 작업을 자동으로 효율적으로 수행할 수 있습니다.