Schützen Sie Ihre Website vor einer sehr häufigen Sicherheitslücke mit der integrierten CSRF-Behandlung von Django.
Django ist ein Python-Webframework, mit dem Sie sichere Webanwendungen erstellen können. Es bietet viele Funktionen, um Entwicklern bei der Sicherheit zu helfen. Eine dieser Funktionen sind CSRF-Token, die zum Schutz von Formularen vor Cross-Site Request Forgery-Angriffen unerlässlich sind.
Was ist ein CSRF-Token?
Ein CSRF-Token ist eine Sicherheitsfunktion, die Webanwendungen davor schützt Cross-Site Request Forgery (CSRF)-Angriffe. Damit kann der Anwendungsserver überprüfen, ob eine Formularübermittlung von einem authentischen Browser stammt oder von einem Hacker gefälscht wurde.
CSRF-Token sind Formulareingaben, die eine Benutzersitzung verfolgen. Eine Website serverseitiges Framework für Webanwendungen generiert in der Regel CSRF-Token für jede eindeutige Benutzersitzung. Der Server überprüft, ob das Token korrekt ist, wenn ein Benutzer ein Formular absendet. CSRF-Token bestehen im Allgemeinen aus zufälligen Zeichenfolgen und Zahlen, wodurch ihre Werte unvorhersehbar werden.
CSRF-Token-Generierung in Django
Djangos bekomme Token() -Funktion generiert zufällig CSRF-Token. Um diese Funktion zu finden, navigieren Sie zu csrf.py Datei in Ihrer Virtuelle Python-Umgebung. Die Ordnerstruktur sollte wie folgt aussehen:
env/
└── Lib/
└── Seitenpakete/
└── django/
└── Middleware/
└── csrf.py
In dieser Datei finden Sie die bekomme Token() Funktion, die das Token zurückgibt. Django verwendet Datenmaskierung um den Wert des Tokens vor Hackern zu schützen.
Standardmäßig aktiviert Django den CSRF-Schutz für Ihre Website, indem es hinzufügt django.middleware.csrf. CsrfViewMiddleware im MITTELWARE Liste Ihrer settings.py Datei. Alles, was Sie tun müssen, ist hinzuzufügen {% csrf_token %} zu deinem POST Formen. Ohne hinzuzufügen {% csrf_token %}, du bekommst ein 403 Verboten) Fehler beim Absenden eines Formulars.
Wenn Sie hinzufügen {% csrf_token %} zu Ihrem Formular hinzufügt, erstellt es automatisch ein verstecktes Eingabefeld mit dem Namen csrfmiddlewaretoken, die den Wert des maskierten CSRF-Tokens enthält. Der Server verwendet diesen Wert, um festzustellen, ob die Formularübermittlung authentisch ist. Sie können den Wert dieses ausgeblendeten Felds überprüfen, indem Sie die Seitenquelle anzeigen oder die Entwicklertools Ihres Browsers verwenden.
Funktionsweise von CSRF-Tokens in Django
Wenn Sie Ihre Website mit dem Formular starten, erstellt Django automatisch eine Browser-Cookie genannt csrftoken. Dieses Cookie verfolgt die Benutzeraktivitäten auf der Website und identifiziert jeden Benutzer eindeutig.
Wenn der Benutzer das Formular absendet, vergleicht der Server den Wert des Cookies mit dem Wert des csrfmiddlewaretoken im versteckten Eingabefeld. Wenn diese Werte übereinstimmen, verarbeitet der Server das Formular erfolgreich, andernfalls wird ein Fehler ausgegeben.
Auf den ersten Blick sind die Werte des Cookies und der csrfmiddlewaretoken scheinen anders zu sein. Dies ist beabsichtigt und fügt dem CSRF-Token eine zusätzliche Schutzebene hinzu. Das CSRF-Token wird wie folgt mit dem Cookie verglichen:
- Der bekomme Token() maskiert das CSRF-Token, bevor es an das Eingabefeld übergeben wird.
- Beim Absenden des Formulars wird das CSRF-Token mit Hilfe des geheimen Schlüssels in der Einstellungsdatei entlarvt.
- Das unmaskierte Token wird mit dem Sitzungscookie verglichen.
- Wenn die Werte gleich sind, wird das Formular verarbeitet. Wenn nicht, gibt der Server einen Fehler zurück.
Um zu verhindern, dass Hacker Ihr CSRF-Token stehlen, erneuert Django es jedes Mal, wenn es eine Benutzersitzung startet.
Erstellen von benutzerdefinierten CSRF-Tokens
Obwohl Django es einfach macht, Ihre Formulare zu schützen, indem Sie einfach die {% csrf_token %}, das Generieren von CSRF-Token und das manuelle Hinzufügen zu Ihren Formularen ist ebenfalls möglich. Importieren Sie dazu die bekomme Token() Funktion:
aus django.middleware.csrf importieren bekomme Token
Aus Ihrer Sicht können Sie das CSRF-Token wie folgt generieren:
defAnsichtsname(Anfrage):
csrf_token = get_token (Anfrage)# Ansichtslogik ausführen
Kontext = {
"csrf_token": csrf_token
}
zurückkehren machen (auffordern, 'app_name/template.html', Kontext=Kontext)
In Ihrer HTML-Vorlage können Sie Ihr Eingabe-Tag manuell einschließen und das hinzufügen csrf_token dazu so:
<formMethode="POST" >
<EingangTyp="versteckt"Name="csrfmiddlewaretoken"Wert="{{ csrf_token }}">
{{form.as_p}}
<TasteTyp="einreichen"Klasse="btn btn-umriss-sekundär">Buch hinzufügenTaste>
form>
Alternativ können Sie das versteckte Eingabefeld auch so aus Ihren Ansichten generieren:
defdeine Ansicht(Anfrage):
csrf_token = get_token (Anfrage)
csrf_token_html = ''.format (csrf_token)# Ansichtslogik ausführen
Kontext = {
"csrf_token": csrf_token_html
}
zurückkehren machen (auffordern, 'app_name/template.html', Kontext=Kontext)
Sie können es dann wie folgt zu Ihrer HTML-Vorlage hinzufügen:
<formMethode="POST" >
{{ csrf_token_html|sicher }}
{{form.as_p}}
<TasteTyp="einreichen"Klasse="btn btn-umriss-sekundär">Buch hinzufügenTaste>
form>
Wenn Sie den CSRF-Schutz Ihres Formulars vollständig kontrollieren möchten, können Sie dies tun, indem Sie Ihr CSRF-Token mit dem im Browser gespeicherten Cookie vergleichen. Basierend auf den Ergebnissen des Vergleichs können Sie die Formularübermittlung beliebig handhaben. Hier ist ein Beispiel:
aus django.Shortcuts importieren machen
aus django.middleware.csrf importieren get_token, _unmask_cipher_token
aus django.utils.crypto importieren constant_time_comparedefdeine Ansicht(Anfrage):
# Generieren Sie ein benutzerdefiniertes CSRF-Token
csrf_token = get_token (Anfrage)
csrf_cookie = Anfrage. COOKIES.get('csrftoken')# Csrf-Token demaskieren
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# Vergleichen Sie die Token
Wennnicht constant_time_compare (unmasked_csrf_token, csrf_cookie):
# Behandle den Fall, wo die Tokens nicht übereinstimmen
passieren
anders:
# Behandeln Sie den Fall, in dem die Token übereinstimmen
passieren
# Rendern Sie die Vorlage
Kontext = {
'csrf_token': csrf_token,
}
zurückkehren machen (auffordern, 'app_name/template.html', Kontext=Kontext)
Dieses Code-Snippet ruft die ab csrf_cookie aus dem HTTP-Request-Objekt. Es verwendet dann die _unmask_cipher_token() Funktion zum Demaskieren der csrf_token.
Eine bedingte Anweisung vergleicht die Werte der abgerufenen csrf_cookie und die Unmaskierten csrf_token. Dieser Vergleich verwendet die constant_time_compare Funktion zum Schutz vor Timing-Exploits. Sie können Ihre Logik basierend auf dem Ergebnis des Vergleichs schreiben.
Deaktivieren des CSRF-Schutzes in Django
Obwohl Django standardmäßig CSRF-Schutz vorsieht, können Sie ihn in Ihrem Projekt deaktivieren, wenn Sie möchten. Dazu gibt es zwei Möglichkeiten:
- Deaktivieren Sie den CSRF-Schutz auf Ihrer gesamten Website.
- Deaktivieren des CSRF-Schutzes für eine bestimmte Ansicht.
Deaktivieren des CSRF-Schutzes auf Ihrer gesamten Website
Um den CSRF-Schutz von Django auf Ihrer Website zu deaktivieren, müssen Sie lediglich die CSRF-Middleware aus Ihrer Einstellungsdatei entfernen. Suchen Sie in Ihrer Einstellungsdatei eine Liste mit dem Namen MITTELWARE. Suchen Sie in der Liste danach:
'django.middleware.csrf. CsrfViewMiddleware',
Sobald Sie es gefunden haben, sollten Sie es aus Ihrem Code für den standardmäßigen CSRF-Schutz von Django entfernen, um es zu deaktivieren.
Deaktivieren des CSRF-Schutzes für eine bestimmte Ansicht
Wenn Sie den CSRF-Schutz nur für eine bestimmte Django-Ansicht deaktivieren möchten, verwenden Sie die @csrf_exempt Dekorateur. Hier ist ein Code-Snippet zur Veranschaulichung:
aus django.views.decorators.csrf importieren csrf_exempt
@csrf_exempt
defAnsichtsname(Anfrage):
# Ansichtslogik ausführen
passieren
Der @csrf_exempt decorator ist nur einer von mehreren, die sich auf den CSRF-Schutz in Django beziehen. Den Rest könnt ihr weiterlesen CSRF-Referenz von Django.
Deaktivieren Sie den CSRF-Schutz auf Ihrer Website nicht
Obwohl Django dies ermöglicht, wird das Deaktivieren des integrierten CSRF-Schutzmechanismus von Django nicht empfohlen. Dadurch wird Ihre Website anfällig für CSRF-Angriffe und wirkt sich letztendlich negativ auf die Benutzer Ihrer App aus.
Wenn Sie kein erfahrener Entwickler sind, der weiß, wie man einen benutzerdefinierten CSRF-Schutzmechanismus implementiert, sollten Sie mit der von Django bereitgestellten Alternative arbeiten.