수색…


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&quot; style=&quot;font-size: 4000px">&lt;script&gt;alert(&#39;hello world!&#39;);&lt;/script&gt;</p>

신뢰할 수 있고 실제로 렌더링하려는 HTML이 포함 된 변수가 있으면 안전하다고 명시해야합니다.

<p class="{{ class_name|safe }}">{{ paragraph }}</p>
<!-- Will be rendered as: -->
<p class="large" style="font-size: 4000px">&lt;script&gt;alert(&#39;hello world!&#39;);&lt;/script&gt;</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&quot; style=&quot;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> &lt;i&gt;world!&lt;/i&gt;</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 , OPTIONSTRACE 제외한 모든 방법)을 사용할 때마다 쿠키는 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(...)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow