Django
보안
수색…
XSS (Cross Site Scripting) 보호
XSS 공격은 HTML (또는 JS) 코드를 페이지에 주입하는 것으로 구성됩니다. 자세한 내용은 크로스 사이트 스크립팅이란? 을 참조하십시오.
이 공격을 막기 위해 Django는 기본적으로 템플릿 변수를 통해 전달 된 문자열을 이스케이프 처리합니다.
다음 상황을 감안할 때 :
context = {
'class_name': 'large" style="font-size:4000px',
'paragraph': (
"<script type=\"text/javascript\">alert('hello world!');</script>"),
}
<p class="{{ class_name }}">{{ paragraph }}</p>
<!-- Will be rendered as: -->
<p class="large" style="font-size: 4000px"><script>alert('hello world!');</script></p>
신뢰할 수 있고 실제로 렌더링하려는 HTML이 포함 된 변수가 있으면 안전하다고 명시해야합니다.
<p class="{{ class_name|safe }}">{{ paragraph }}</p>
<!-- Will be rendered as: -->
<p class="large" style="font-size: 4000px"><script>alert('hello world!');</script></p>
모든 변수가 안전한 여러 블록이있는 경우 자동으로 이스케이프를 사용하지 않도록 설정할 수 있습니다.
{% autoescape off %}
<p class="{{ class_name }}">{{ paragraph }}</p>
{% endautoescape %}
<!-- Will be rendered as: -->
<p class="large" style="font-size: 4000px"><script>alert('hello world!');</script></p>
템플릿 외부에서 문자열을 안전한 것으로 표시 할 수도 있습니다.
from django.utils.safestring import mark_safe
context = {
'class_name': 'large" style="font-size:4000px',
'paragraph': mark_safe(
"<script type=\"text/javascript\">alert('hello world!');</script>"),
}
<p class="{{ class_name }}">{{ paragraph }}</p>
<!-- Will be rendered as: -->
<p class="large" style="font-size: 4000px"><script>alert('hello world!');</script></p>
format_html
과 같은 일부 Django 유틸리티는 이미 안전하다고 표시된 문자열을 반환합니다.
from django.utils.html import format_html
context = {
'var': format_html('<b>{}</b> {}', 'hello', '<i>world!</i>'),
}
<p>{{ var }}</p>
<!-- Will be rendered as -->
<p><b>hello</b> <i>world!</i></p>
클릭 재킹
클릭 재킹 (clickjacking)은 웹 사용자를 속여 사용자가 클릭하는 것과 다른 것을 클릭하도록하는 악의적 인 기법입니다. 더 알아보기
클릭 재킹 방지를 사용하려면 XFrameOptionsMiddleware
를 미들웨어 클래스에 추가하십시오. 당신이 그것을 제거하지 않았다면 이미 거기에 있어야합니다.
# settings.py
MIDDLEWARE_CLASSES = [
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
이 미들웨어는 명시 적으로 면제되거나 이미 설정되지 않은 경우 (응답에 이미 설정된 경우 무시되지 않음) 'X-Frame-Options'헤더를 모든 응답에 설정합니다. 기본적으로 "SAMEORIGIN"으로 설정됩니다. 이를 변경하려면 X_FRAME_OPTIONS
설정을 사용하십시오.
X_FRAME_OPTIONS = 'DENY'
뷰별로 기본 동작을 재정의 할 수 있습니다.
from django.utils.decorators import method_decorator
from django.views.decorators.clickjacking import (
xframe_options_exempt, xframe_options_deny, xframe_options_sameorigin,
)
xframe_options_exempt_m = method_decorator(xframe_options_exempt, name='dispatch')
@xframe_options_sameorigin
def my_view(request, *args, **kwargs):
"""Forces 'X-Frame-Options: SAMEORIGIN'."""
return HttpResponse(...)
@method_decorator(xframe_options_deny, name='dispatch')
class MyView(View):
"""Forces 'X-Frame-Options: DENY'."""
@xframe_options_exempt_m
class MyView(View):
"""Does not set 'X-Frame-Options' header when passing through the
XFrameOptionsMiddleware.
"""
교차 사이트 요청 위조 (CSRF) 보호
원 클릭 공격 또는 세션 라이딩이라고도하며 CSRF 또는 XSRF라고도하는 교차 사이트 요청 위조는 웹 사이트가 신뢰하는 사용자로부터 승인되지 않은 명령이 전송되는 웹 사이트의 악의적 인 공격 유형입니다. 더 알아보기
CSRF 보호를 사용하려면 미들웨어 클래스에 CsrfViewMiddleware
를 추가하십시오. 이 미들웨어는 기본적으로 사용하도록 설정되어 있습니다.
# settings.py
MIDDLEWARE_CLASSES = [
...
'django.middleware.csrf.CsrfViewMiddleware',
...
]
이 미들웨어는 나가는 응답의 쿠키에 토큰을 설정합니다. 들어오는 요청이 안전하지 않은 방법 ( GET
, HEAD
, OPTIONS
및 TRACE
제외한 모든 방법)을 사용할 때마다 쿠키는 csrfmiddlewaretoken
양식 데이터 나 X-CsrfToken
헤더로 보내는 토큰과 일치해야합니다. 이렇게하면 요청을 시작한 클라이언트가 쿠키 및 확장 (인증 된) 세션의 소유자이기도합니다.
HTTPS
통해 요청한 경우 엄격한 참조 자 확인이 사용됩니다. HTTP_REFERER
헤더가 현재 요청의 호스트 또는 CSRF_TRUSTED_ORIGINS
( 1.9의 새로운 기능)에 있는 호스트와 일치하지 않으면 요청이 거부됩니다.
POST
메소드를 사용하는 양식은 CSRF 토큰을 템플리트에 포함해야합니다. {% csrf_token %}
템플릿 태그는 숨김 필드를 출력하고 쿠키가 응답에 설정되도록합니다 :
<form method='POST'>
{% csrf_token %}
...
</form>
CSRF 공격에 취약하지 않은 개별보기는 @csrf_exempt
데코레이터를 사용하여 면제 될 수 있습니다.
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request, *args, **kwargs):
"""Allows unsafe methods without CSRF protection"""
return HttpResponse(...)
권장하지는 않지만 많은 뷰가 CSRF 공격에 취약하지 않은 경우 CsrfViewMiddleware
비활성화 할 수 있습니다. 이 경우 @csrf_protect
데코레이터를 사용하여 개별 뷰를 보호 할 수 있습니다.
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def my_view(request, *args, **kwargs):
"""This view is protected against CSRF attacks if the middleware is disabled"""
return HttpResponse(...)