透過 CSRF 保護保護 Django AJAX 請求
Django 的內建 CSRF(跨站請求偽造)保護在使用 django-admin startproject
建立專案時預設啟用,利用 CSRF 令牌來防範惡意請求。 此中間件已新增至您的 settings.py
.
對 Django 應用程式的每個 POST 請求都需要有效的 CSRF 令牌。在 Django 範本中,這是透過使用 POST 方法在任何表單中包含 {% csrf_token %}
來實現的。 然而,使用單獨的前端 AJAX 請求處理 CSRF 保護需要不同的方法。
本教學示範使用來自單獨前端的 AJAX 請求來保護簡單的 Django 應用程式。
應用程式設定
我們的範例應用程式有兩個端點:
-
GET
/get-picture
:擷取儲存在伺服器上的映像的 URL。 -
POST
/set-picture
:更新儲存在伺服器上的映像的 URL。
為了簡單起見,省略了錯誤處理。 初始後端程式碼(在urls.py
中)如下:
from django.urls import path from django.http import JsonResponse import json picture_url = "https://picsum.photos/id/247/720/405" def get_picture(request): return JsonResponse({"picture_url": picture_url}) def set_picture(request): if request.method == "POST": global picture_url picture_url = json.loads(request.body)["picture_url"] return JsonResponse({"picture_url": picture_url}) urlpatterns = [ path("get-picture", get_picture), path("set-picture", set_picture) ]
對應的前端功能(簡體):
// GET request to retrieve the image URL async function get_picture() { const res = await fetch("http://localhost:8000/get-picture"); const data = await res.json(); return data.picture_url; } // POST request to update the image URL async function set_picture(picture_url) { const res = await fetch("http://localhost:8000/set-picture", { method: "POST", body: JSON.stringify({ "picture_url": picture_url }) }); }
為了處理跨來源資源共享(CORS),我們將使用 django-cors-headers
套件。
啟用 CORS 和 CSRF 保護
安裝django-cors-headers
:
pip install django-cors-headers
配置settings.py
:
INSTALLED_APPS = [ "corsheaders", # ... other apps ] MIDDLEWARE = [ "corsheaders.middleware.CorsMiddleware", # ... other middleware ] CORS_ALLOWED_ORIGINS = ["http://localhost:4040"] # Adjust port as needed CSRF_TRUSTED_ORIGINS = ["http://localhost:4040"] # Add your frontend origin
雖然 GET 請求現在可以正常工作,但 POST 請求將由於 CSRF 保護而失敗。 為了解決這個問題,我們需要手動管理 CSRF 令牌。
取得並使用 CSRF 令牌
建立一個新視圖來提供 CSRF 令牌:
from django.views.decorators.csrf import ensure_csrf_cookie from django.http import JsonResponse @ensure_csrf_cookie def get_csrf_token(request): return JsonResponse({"success": True}) urlpatterns = [ # ... other paths path("get-csrf-token", get_csrf_token), ]
更新前端以取得令牌(使用js-cookie
):
fetch("http://localhost:8000/get-csrf-token", { credentials: "include" });
credentials: "include"
選項可確保瀏覽器處理任何 Set-Cookie
標頭,儲存 csrftoken
cookie。 檢查瀏覽器開發者工具中的網路標籤以驗證 cookie 是否已設定。
修改 POST 請求
最後,修改 set_picture
函數以在標頭中包含 CSRF 令牌:
async function set_picture(picture_url) { const res = await fetch("http://localhost:8000/set-picture", { method: "POST", credentials: "include", headers: { 'X-CSRFToken': Cookies.get("csrftoken") }, body: JSON.stringify({ "picture_url": picture_url }) }); }
這會新增 X-CSRFToken
標頭以及 csrftoken
cookie 中的值,從而啟用成功的 POST 請求。
重要注意事項
這種方法有局限性,尤其是在不同域上部署前端和後端時。 瀏覽器安全性原則可能會阻止設定或存取第三方 cookie,進而影響 CSRF 令牌管理。
資源
以上是將 CSRF 保護與 Django 和 AJAX 請求結合使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Tomergelistsinpython,YouCanusethe操作員,estextMethod,ListComprehension,Oritertools

在Python3中,可以通過多種方法連接兩個列表:1)使用 運算符,適用於小列表,但對大列表效率低;2)使用extend方法,適用於大列表,內存效率高,但會修改原列表;3)使用*運算符,適用於合併多個列表,不修改原列表;4)使用itertools.chain,適用於大數據集,內存效率高。

使用join()方法是Python中從列表連接字符串最有效的方法。 1)使用join()方法高效且易讀。 2)循環使用 運算符對大列表效率低。 3)列表推導式與join()結合適用於需要轉換的場景。 4)reduce()方法適用於其他類型歸約,但對字符串連接效率低。完整句子結束。

pythonexecutionistheprocessoftransformingpypythoncodeintoExecutablestructions.1)InternterPreterReadSthecode,ConvertingTingitIntObyTecode,whepythonvirtualmachine(pvm)theglobalinterpreterpreterpreterpreterlock(gil)the thepythonvirtualmachine(pvm)

Python的關鍵特性包括:1.語法簡潔易懂,適合初學者;2.動態類型系統,提高開發速度;3.豐富的標準庫,支持多種任務;4.強大的社區和生態系統,提供廣泛支持;5.解釋性,適合腳本和快速原型開發;6.多範式支持,適用於各種編程風格。

Python是解釋型語言,但也包含編譯過程。 1)Python代碼先編譯成字節碼。 2)字節碼由Python虛擬機解釋執行。 3)這種混合機制使Python既靈活又高效,但執行速度不如完全編譯型語言。

UseeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.forloopsareIdealForkNownsences,而WhileLeleLeleLeleLeleLoopSituationSituationsItuationsItuationSuationSituationswithUndEtermentersitations。

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐個偏置,零indexingissues,andnestedloopineflinefficiencies


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用