크로스 사이트 스크립팅 (Cross-Site Scripting, XSS) 공격을 방어하기 위한 방법과 예제를 설명하겠습니다. XSS는 웹 애플리케이션 취약점 중 하나로, 공격자가 악의적인 스크립트를 웹 페이지에 삽입하여 사용자의 브라우저에서 실행시키는 공격입니다.
XSS 방어 방법
-
HTML 이스케이프 (HTML Encoding):
모든 사용자 입력 데이터를 HTML 이스케이프하여 특수 문자를 변환합니다. 이렇게 하면 입력된 스크립트가 실제로 렌더링되지 않고 텍스트로 표시됩니다.
# Django 예제
from django.utils.html import escape
user_input = "<script>alert('XSS Attack')</script>"
safe_input = escape(user_input)
-
템플릿 시스템 사용:
템플릿 시스템 (예: Django 템플릿 엔진)을 사용하여 변수를 템플릿에 삽입할 때 자동으로 이스케이프 처리를 수행합니다. 이로써 입력 데이터가 스크립트로 해석되지 않습니다.
<pre>
<code>
<!-- Django 템플릿 예제 -->
<div>{{ user_input }}</div>
</code>
</pre>
-
Content Security Policy (CSP) 사용:
CSP 헤더를 사용하여 특정 도메인에서 로드되는 리소스와 스크립트의 실행을 제한합니다. 이를 통해 외부 스크립트의 삽입을 방지할 수 있습니다.
<pre>
<code>
<!-- CSP 헤더 설정 예제 -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
</code>
</pre>
-
입력 데이터 유효성 검사:
입력 데이터를 엄격하게 유효성 검사하여 예상치 않은 입력을 걸러냅니다. 특히 HTML 태그나 JavaScript 이벤트 핸들러를 필터링합니다.
# Python 예제
def sanitize_input(user_input):
# 입력 데이터를 유효성 검사 및 필터링
sanitized_input = user_input.replace('<', '').replace('>', '')
return sanitized_input
XSS 방어 예제
Django에서 XSS 방어를 적용한 예제를 살펴보겠습니다.
- 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 방어를 수행하고, 이스케이프된 값이 템플릿에서 렌더링됩니다.
-
CSP 사용:
Django에서는
django-csp
라이브러리를 사용하여 CSP 헤더를 설정할 수 있습니다. 설정 후 애플리케이션의settings.py
파일에 CSP 관련 설정을 추가합니다.
# settings.py
CSP_* 설정 추가
자세한 설정 방법은 [django-csp 문서](https://django-csp.readthedocs.io/en/latest/)를 참고하세요.
위의 방법을 통해 XSS 공격으로부터 애플리케이션을 보호할 수 있습니다. 사용자 입력을 이스케이프하고, CSP를 사용하여 외부 스크립트 실행을 제한하며, 입력 데이터를 유효성 검사하여 안전하게 처리합니다.