跨站點請求偽造(CSRF)保護

跨站點請求偽造,也稱為一鍵式攻擊或會話騎行,縮寫為 CSRF 或 XSRF,是一種惡意利用網站,其中未經授權的命令從網站信任的使用者傳輸。學到更多

要啟用 CSRF 保護,請將 CsrfViewMiddleware 新增到中介軟體類。預設情況下啟用此中介軟體。

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

此中介軟體將在傳出響應的 cookie 中設定令牌。每當傳入的請求使用不安全的方法(除 GETHEADOPTIONSTRACE 之外的任何方法)時,cookie 必須匹配作為 csrfmiddlewaretoken 表單資料或 X-CsrfToken 標頭髮送的標記。這可確保發起請求的客戶端也是 cookie 的所有者,並且通過擴充套件,還可以確認(經過身份驗證的)會話。

如果通過 HTTPS 發出請求,則啟用嚴格的引薦來源檢查。如果 HTTP_REFERER 標頭與當前請求的主機或 CSRF_TRUSTED_ORIGINS 中的主機( 1.9 中的新主機)不匹配,則拒絕該請求。

使用 POST 方法的表單應在模板中包含 CSRF 令牌。{% csrf_token %} 模板標記將輸出一個隱藏欄位,並確保在響應中設定 cookie:

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

使用 @csrf_exempt 裝飾器可以免除不易受 CSRF 攻擊的個人觀點:

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(...)