Suche…


Cross Site Scripting (XSS) -Schutz

XSS-Angriffe bestehen darin, HTML-Code (oder JS-Code) in eine Seite einzufügen. Weitere Informationen finden Sie unter Was ist Cross Site Scripting .

Um diesen Angriff zu verhindern, entgeht Django standardmäßig Zeichenfolgen, die durch eine Vorlagenvariable übergeben werden.

In folgendem Zusammenhang:

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>

Wenn Sie Variablen haben, die HTML enthalten, denen Sie vertrauen und tatsächlich rendern möchten, müssen Sie ausdrücklich sagen, dass es sicher ist:

<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>

Wenn Sie einen Block mit mehreren Variablen haben, die alle sicher sind, können Sie die automatische Escape-Funktion lokal deaktivieren:

{% 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>

Sie können eine Zeichenfolge auch außerhalb der Vorlage als sicher markieren:

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>

Einige Django-Dienstprogramme wie format_html bereits als sicher markierte Zeichenfolgen zurück:

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-Schutz

Clickjacking ist eine bösartige Technik, bei der ein Webbenutzer dazu verleitet wird, auf etwas zu klicken, das sich von dem unterscheidet, was der Benutzer als er wahrnimmt. Mehr erfahren

Um den Clickjacking-Schutz zu aktivieren, fügen Sie die XFrameOptionsMiddleware Ihren Middleware-Klassen hinzu. Dies sollte bereits vorhanden sein, wenn Sie es nicht entfernt haben.

# settings.py
MIDDLEWARE_CLASSES = [
    ...
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ...
]

Diese Middleware setzt den 'X-Frame-Options'-Header auf alle Ihre Antworten, sofern nicht ausdrücklich freigestellt oder bereits festgelegt (nicht überschrieben, wenn in der Antwort bereits festgelegt). Standardmäßig ist "SAMEORIGIN" eingestellt. Um dies zu ändern, verwenden Sie die Einstellung X_FRAME_OPTIONS :

X_FRAME_OPTIONS = 'DENY'

Sie können das Standardverhalten für einzelne Ansichten überschreiben.

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.
    """

Cross-Site Request Forgery (CSRF) -Schutz

Cross-Site Request Forgery, auch als One-Click-Attack oder Session-Riding bezeichnet und als CSRF oder XSRF bezeichnet, ist eine bösartige Ausnutzung einer Website, bei der nicht autorisierte Befehle von einem Benutzer übertragen werden, dem die Website vertraut. Mehr erfahren

Um den CSRF-Schutz zu aktivieren, fügen Sie die CsrfViewMiddleware zu Ihren Middleware-Klassen hinzu. Diese Middleware ist standardmäßig aktiviert.

# settings.py
MIDDLEWARE_CLASSES = [
    ...
    'django.middleware.csrf.CsrfViewMiddleware',
    ...
]

Diese Middleware setzt in der abgehenden Antwort ein Token in einem Cookie. Immer wenn eine eingehende Anforderung eine unsichere Methode verwendet (eine beliebige Methode außer GET , HEAD , OPTIONS und TRACE ), muss das Cookie einem Token entsprechen, das als csrfmiddlewaretoken Formulardaten oder als X-CsrfToken Header X-CsrfToken . Dadurch wird sichergestellt, dass der Client, der die Anforderung initiiert, auch der Eigentümer des Cookies und in der Folge die (authentifizierte) Sitzung ist.

Wenn eine Anforderung über HTTPS , ist die strikte Verweisprüfung aktiviert. Wenn der HTTP_REFERER Header nicht mit dem Host der aktuellen Anforderung oder einem Host in CSRF_TRUSTED_ORIGINS ( neu in 1.9 ) CSRF_TRUSTED_ORIGINS , wird die Anfrage abgelehnt.

Formulare, die die POST Methode verwenden, sollten das CSRF-Token in die Vorlage aufnehmen. Das Vorlagen-Tag {% csrf_token %} gibt ein ausgeblendetes Feld aus und stellt sicher, dass das Cookie für die Antwort festgelegt ist:

<form method='POST'>
{% csrf_token %}
...
</form>

Einzelne Ansichten, die nicht anfällig für CSRF-Angriffe sind, können mit dem Dekorator @csrf_exempt ausgenommen werden:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request, *args, **kwargs):
    """Allows unsafe methods without CSRF protection"""
    return HttpResponse(...)

Obwohl dies nicht empfohlen wird, können Sie CsrfViewMiddleware deaktivieren, wenn viele Ihrer Ansichten nicht anfällig für CSRF-Angriffe sind. In diesem Fall können Sie den @csrf_protect Dekorator verwenden, um einzelne Ansichten zu schützen:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow