Seitenentwicklung mit Python – weitere Kernfunktionen von Django

Inhaltsverzeichnis

1. Statische Dateien

Statische Dateien konfigurieren

2. Csrf

Die Verwendung von CSRF

ungeschützt

Schutzprinzip

3. Statuspflege

offene Sitzung

Sitzung verwenden

4. Middleware

Stellen Sie sicher, dass der Benutzer angemeldet ist. Beispiel

Middleware konfigurieren

5. Verwenden Sie das in Django bereitgestellte Passwortschema

MD5-Verschlüsselung in Python


1. Statische Dateien

Das CSS, die Bilder und die JS im Projekt sind alle statische Dateien

Statische Dateien konfigurieren

1. Definieren Sie statischen Inhalt in der Einstellungsdatei

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

2. Erstellen Sie ein statisches Verzeichnis unter dem Projektstammverzeichnis und erstellen Sie dann ein Verzeichnis mit dem aktuellen Anwendungsnamen

mysite/static/myapp/

3. In der Vorlage kann Hardcoding verwendet werden

/static/my_app/myexample.jpg

4. Statische Codierung kann in der Vorlage verwendet werden

{ % load static from staticfiles % }
<img src="{ % static "my_app/myexample.jpg" % }" alt="My image"/>

2. Csrf

CSRF (Cross-Site Request Forgery) Cross-Site Request Forgery, auch bekannt als „One Click Attack“ oder Session Riding, meist abgekürzt als CSRF oder XSRF, ist eine böswillige Nutzung von Websites. Obwohl es wie Cross-Site-Scripting (XSS) klingt , unterscheidet es sich stark von XSS, das vertrauenswürdige Benutzer innerhalb einer Site ausnutzt, und CSRF, das vertrauenswürdige Websites ausnutzt, indem es Anfragen von vertrauenswürdigen Benutzern verschleiert. Im Vergleich zu XSS- Angriffen sind CSRF-Angriffe tendenziell weniger beliebt (daher sind die Ressourcen zu ihrer Verhinderung recht knapp) und schwer zu verhindern, sodass sie als gefährlicher als XSS gelten

CSRF-Middleware und Vorlagen-Tags bieten einen benutzerfreundlichen Schutz gegen die Fälschung standortübergreifender Anfragen .

Diese Art von Angriff wird mithilfe der Anmeldeinformationen eines angemeldeten Benutzers ausgeführt, der die bösartige Website in einem Browser besucht, wenn die bösartige Website Links, Formularschaltflächen oder JavaScript enthält, das darauf ausgelegt ist, bestimmte Aktionen auf Ihrer Website auszuführen.

Es wird auch ein verwandter Angriffstyp, „Login CSRF“, beschrieben, bei dem eine angreifende Website den Browser eines Benutzers dazu bringt, sich mit den Anmeldeinformationen einer anderen Person bei einer Website anzumelden.

Die Verwendung von CSRF

In der Django-Vorlage wird eine Methode zur Verhinderung standortübergreifender Angriffe bereitgestellt. Die Schritte lauten wie folgt:

  • Schritt 1: Aktivieren Sie die Middleware „django.middleware.csrf.CsrfViewMiddleware“ in „settings.py“, die beim Erstellen eines Projekts standardmäßig aktiviert ist
  • Schritt 2: Tags zum HTML-Formular hinzufügen
    <form>
    { % csrf_token % }
    ...
    </form>
    

ungeschützt

Wenn einige Ansichten nicht geschützt werden müssen, können Sie den Dekorator csrf_exempt verwenden und müssen keine Tags in die Vorlage schreiben. Ändern Sie die Ansicht von csrf2 wie folgt aus django.views.decorators.csrf import csrf_exempt

@csrf_exempt 
def csrf2(request):
    uname=request.POST['uname'] 
    return render(request,'booktest/csrf2.html',{'uname':uname}) 
    运行上面的两个请求,发现都可以请求

Schutzprinzip

Nachdem Sie das Tag hinzugefügt haben, können Sie den Quellcode anzeigen und den folgenden Code finden

<input type='hidden' name='csrfmiddlewaretoken' value='nGjAB3Md9ZSb4NmG1sXDolPmh3bR2g59' />
  • Im Debugging-Tool des Browsers können die Cookie-Informationen über die Registerkarte „Netzwerk“ angezeigt werden

  • Cookie-Informationen werden dieser Website automatisch hinzugefügt, wie in der folgenden Abbildung csrf3 dargestellt

  • Überprüfen Sie die Cross-Site-Informationen. Es gibt keine Cookie-Informationen. Selbst wenn Sie den oben versteckten Domain-Code hinzufügen, können Sie ihn erneut besuchen

  • Fazit: Djangos CSRF ist nicht vollständig sicher

  • Beim Senden einer Anfrage überprüft die Middleware „django.middleware.csrf.CsrfViewMiddleware“ den Inhalt des übermittelten Cookies und der versteckten Domäne und gibt einen 403-Fehler zurück, wenn dies fehlschlägt

Ajax CSRF-Authentifizierung

GET-Anfragen erfordern keine CSRF-Authentifizierung und POST-Anfragen erfordern eine korrekte Authentifizierung, um korrekte Rückgabeergebnisse zu erhalten.

Wenn Sie Ajax-Aufrufe verwenden, ist dies problematischer. Beachten Sie folgende Punkte:

  • Verwenden Sie render in der Ansicht  (anstelle von render_to_response).
  • Fügen Sie diesen JS-Code hinzu, bevor Sie Ajax oder Post von jQuery verwenden

    jQuery(document).ajaxSend(function(event, xhr, settings) {
        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
        function sameOrigin(url) {
            // url could be relative or scheme relative or absolute
            var host = document.location.host; // host + port
            var protocol = document.location.protocol;
            var sr_origin = '//' + host;
            var origin = protocol + sr_origin;
            // Allow absolute or scheme relative URLs to same origin
            return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
                (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
                // or any other URL that isn't scheme relative or absolute i.e relative.
                !(/^(\/\/|http:|https:).*/.test(url));
        }
        function safeMethod(method) {
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }
    
        if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
            xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
        }
    });
    
  • Oder  eleganterer und prägnanterer Code (kann nicht in .js geschrieben werden, sondern direkt in der Vorlagendatei ):

    $.ajaxSetup({
        data: {csrfmiddlewaretoken: '{ { csrf_token } }' },
    });
    

Danach können Sie jQuery.ajax() und jQuery.post() wie zuvor verwenden

3. Statuspflege

  • Das HTTP-Protokoll ist zustandslos: Jede Anfrage ist eine neue Anfrage und der Status
  • Eine Kommunikation zwischen dem Client und dem Server ist eine Sitzung
  • Der Weg zur Zustandserhaltung besteht darin, sitzungsbezogene Daten auf dem Client oder Server zu speichern
  • Zu den Speichermethoden gehören Cookies, Sitzungen und Sitzungen beziehen sich im Allgemeinen auf Sitzungsobjekte
  • Mithilfe von Cookies werden alle Daten auf der Clientseite gespeichert. Achten Sie darauf, keine sensiblen Informationen zu speichern
  • Es wird empfohlen, die Sitzungsmethode zu verwenden. Alle Daten werden auf der Serverseite gespeichert und die Sitzungs-ID wird im Client-Cookie gespeichert
  • Der Zweck der Statusverwaltung besteht darin, den Status des Anforderers über einen bestimmten Zeitraum zu verfolgen, wodurch ein seitenübergreifender Zugriff auf die Daten des aktuellen Anforderers realisiert werden kann
  • Hinweis: Diese Daten werden nicht zwischen verschiedenen Anforderern geteilt und entsprechen dem Anforderer eins zu eins

offene Sitzung

  • Mit django-admin startproject erstellte Projekte sind standardmäßig aktiviert
  • Sitzung deaktivieren: Entfernen Sie die beiden unten angegebenen Werte. Durch Deaktivieren der Sitzung wird etwas Leistungsverbrauch eingespart
  • Die Sitzung in Django muss auf der Datenbank basieren. Daher muss überprüft werden, ob die Datenbank sitzungsbezogene Tabellen enthält
  • In der Datei „settings.py“.

    * 项INSTALLED_APPS列表中添加:
    * 'django.contrib.sessions',
    
    * 项MIDDLEWARE_CLASSES列表中添加:
    * 'django.contrib.sessions.middleware.SessionMiddleware',
    

Sitzung verwenden

  • Wenn Sitzungen aktiviert sind, verfügt jedes HttpRequest-Objekt über ein Sitzungsattribut, bei dem es sich um ein wörterbuchähnliches Objekt handelt
  • get(key, default=None): Ruft den Wert der Sitzung gemäß dem Schlüssel ab
  • clear(): Alle Sitzungen löschen
  • Flush(): Löscht die aktuellen Sitzungsdaten und löscht das Sitzungscookie
  • del request.session['member_id']: Sitzung löschen
  • Beispiel:

    #session设置
     request.session[key] = value
    
    #session获取
     request.session.get(key,default=Node)
    
    #session删除
    
    # 删除单个key 不存在时报错
     del request.session['a'] 
    
    #清除所有会话,但不会删除数据
     request.session.clear() 
    
    #删除当前的会话数据
     request.session.flush()

4. Middleware

  • Middleware ist ein leichtes Plug-In-System auf niedriger Ebene, das in die Anforderungs- und Antwortverarbeitung von Django eingreifen und die Eingabe oder Ausgabe von Django ändern kann
  • Aktivierung: zum Tupel MIDDLEWARE_CLASSES in der Django-Konfigurationsdatei hinzugefügt
  • Mithilfe von Middleware können Sie in den gesamten Verarbeitungsprozess eingreifen. Diese Middleware-Methode wird bei jeder Anforderung ausgeführt

Stellen Sie sicher, dass der Benutzer angemeldet ist. Beispiel

Erstellen Sie eine AdminLoginMiddleware.py-Datei in Ihrer App

from django.shortcuts import render
from django.http import HttpResponse
import re

class AdminLoginMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):


        # 检测当前的请求是否已经登录,如果已经登录,.则放行,如果未登录,则跳转到登录页
        # 获取当前用户的请求路径  /admin/开头  但不是 /admin/login/  /admin/dologin/   /admin/verifycode
        urllist = ['/admin/login','/admin/dologin','/admin/vcode']
        # 判断是否进入了后台,并且不是进入登录页面
        if re.match('/admin/',request.path) and request.path not in urllist:

            # 检测session中是否存在 adminlogin的数据记录
            if request.session.get('Vuser','') == '':
                # 如果在session没有记录,则证明没有登录,跳转到登录页面
                return HttpResponse('<script>alert("请先登录");location.href="/admin/login";</script>')



        response = self.get_response(request)
        return response

Middleware konfigurieren

Ändern Sie die Option MIDDLEWARE_CLASSES in der Datei „settings.py“.

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    #自定义的中间件
    'myadmin.AdminMiddleware.AdminLoginMiddleware'
]

5. Verwenden Sie das in Django bereitgestellte Passwortschema

Das Modul django.contrib.auth.hashers bietet eine Reihe von Funktionen zum Erstellen und Überprüfen gehashter Passwörter. Sie können sie unabhängig vom UserModell verwenden.

 # from django.contrib.auth.hashers import make_password, check_password

 # 对密码进行加密操作
 # upass = make_password(request.POST['password'], None, 'pbkdf2_sha256')
 # upass = check_password('1234567','pbkdf2_sha256$36000$197nqXM6yxYv$Zxh/Vsns8qszkvUmY81BgrjCeLPXhCHLEilP6VO+Rnc=')

MD5-Verschlüsselung in Python

#获取密码并md5
import hashlib
m = hashlib.md5() 
m.update(bytes(request.POST['password'],encoding="utf8"))
print(m.hexdigest())

 

 

 

 

おすすめ

転載: blog.csdn.net/weixin_63994459/article/details/126145417