跨站點請求偽造(CSRF)保護
跨站點請求偽造,也稱為一鍵式攻擊或會話騎行,縮寫為 CSRF 或 XSRF,是一種惡意利用網站,其中未經授權的命令從網站信任的使用者傳輸。學到更多
要啟用 CSRF 保護,請將 CsrfViewMiddleware
新增到中介軟體類。預設情況下啟用此中介軟體。
# settings.py
MIDDLEWARE_CLASSES = [
...
'django.middleware.csrf.CsrfViewMiddleware',
...
]
此中介軟體將在傳出響應的 cookie 中設定令牌。每當傳入的請求使用不安全的方法(除 GET
,HEAD
,OPTIONS
和 TRACE
之外的任何方法)時,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(...)