[파이썬][Django] 크로스 사이트 스크립팅 (XSS) 방어 방법과 예제

크로스 사이트 스크립팅 (Cross-Site Scripting, XSS) 공격을 방어하기 위한 방법과 예제를 설명하겠습니다. XSS는 웹 애플리케이션 취약점 중 하나로, 공격자가 악의적인 스크립트를 웹 페이지에 삽입하여 사용자의 브라우저에서 실행시키는 공격입니다.

XSS 방어 방법

  1. HTML 이스케이프 (HTML Encoding):

    모든 사용자 입력 데이터를 HTML 이스케이프하여 특수 문자를 변환합니다. 이렇게 하면 입력된 스크립트가 실제로 렌더링되지 않고 텍스트로 표시됩니다.

# Django 예제
    
    from django.utils.html import escape
    
    user_input = "<script>alert('XSS Attack')</script>"
    safe_input = escape(user_input)
  1. 템플릿 시스템 사용:

    템플릿 시스템 (예: Django 템플릿 엔진)을 사용하여 변수를 템플릿에 삽입할 때 자동으로 이스케이프 처리를 수행합니다. 이로써 입력 데이터가 스크립트로 해석되지 않습니다.

<pre>
<code>

<!-- Django 템플릿 예제 -->
    
    <div>{{ user_input }}</div>

</code>
</pre>
  1. Content Security Policy (CSP) 사용:

    CSP 헤더를 사용하여 특정 도메인에서 로드되는 리소스와 스크립트의 실행을 제한합니다. 이를 통해 외부 스크립트의 삽입을 방지할 수 있습니다.

<pre>
<code>

<!-- CSP 헤더 설정 예제 -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'">

</code>
</pre>
  1. 입력 데이터 유효성 검사:

    입력 데이터를 엄격하게 유효성 검사하여 예상치 않은 입력을 걸러냅니다. 특히 HTML 태그나 JavaScript 이벤트 핸들러를 필터링합니다.

# Python 예제
    
    def sanitize_input(user_input):
        # 입력 데이터를 유효성 검사 및 필터링
        sanitized_input = user_input.replace('<', '').replace('>', '')
        return sanitized_input

XSS 방어 예제

Django에서 XSS 방어를 적용한 예제를 살펴보겠습니다.

  1. HTML 이스케이프 사용:
# views.py
    
    from django.shortcuts import render
    from django.utils.html import escape
    
    def my_view(request):
        user_input = "<script>alert('XSS Attack')</script>"
        safe_input = escape(user_input)
        return render(request, 'my_template.html', {'user_input': safe_input})
<pre>
<code>

<!-- my_template.html -->
    
    <div>{{ user_input }}</div>

</code>
</pre>
위의 예제에서는 `escape` 함수를 사용하여 `user_input` 변수에 대한 XSS 방어를 수행하고, 이스케이프된 값이 템플릿에서 렌더링됩니다.
  1. CSP 사용:

    Django에서는 django-csp 라이브러리를 사용하여 CSP 헤더를 설정할 수 있습니다. 설정 후 애플리케이션의 settings.py 파일에 CSP 관련 설정을 추가합니다.

# settings.py
    
    CSP_* 설정 추가
자세한 설정 방법은 [django-csp 문서](https://django-csp.readthedocs.io/en/latest/)를 참고하세요.

위의 방법을 통해 XSS 공격으로부터 애플리케이션을 보호할 수 있습니다. 사용자 입력을 이스케이프하고, CSP를 사용하여 외부 스크립트 실행을 제한하며, 입력 데이터를 유효성 검사하여 안전하게 처리합니다.