Django之CSRF 機制

在理解Django中的CSRF機制前,可以先補一補基礎知識

官網對於CSRF的說明

pythenweb 開發中的csrf機制

CSRF全稱

Cross-site request forgery (CSRF)

很簡單的一個知識點,就是一個跨站請求僞造保護,看一下官網對於CSRF的說明和csrf機制兩篇文章對CSRF機制有個初步理解。

實戰
  • CSRF機制的載體Django自帶的中間件

知識點部分可能不太理解,下面直接用簡單Demo來說明CSRF機制,對應上面兩篇指導性文章加深理解。

Django項目中,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',
]

說明CSRF是Jdango自帶的一箇中間件罷了,默認是打開的。

  • csrf代碼演示
    在csrfmodule App中views.py 中
def login(request):
    print(request.method)
    if request.method == 'POST':
        return render(request, 'csrf_result_index.html')
    return render(request, 'test_csrf_login.html')

test_csrf_login.html代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link rel="stylesheet" href="/static/commons.css">
    <style>
        label {
            width: 80px;
            text-align: right;
            display: inline-block;
        }
    </style>
</head>
<body>
<form action="/csrfmodule/login/" method="post">
    <p>
        <label for="username">用戶名:</label>
        <input id="username" name="user" type="text"/>
    </p>
    <p>
        <label for="password">密碼:</label>
        <input id="password" name="pwd" type="password"/>
        <input type="submit" value="提交"/>
    </p>
</form>
<script src="/static/jquery3.4.1.js"></script>
</body>
</html>

csrf_result_index.html代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
</html>

配置csrfmodule的App中urls代碼

urlpatterns = [
    path('login/', views.login),  # 分發器
]

運行Django程序

直接點擊提交,理論上直接跳轉到csrf_result_index.html頁面的,看看實際結果。
在這裏插入圖片描述

先不要一臉懵逼,這就對了。

更改代碼test_csrf_login.html,只需要在form標籤裏面加入一行代碼
再次運行Django項目。
在這裏插入圖片描述
重點來了:看一下這個網頁源代碼

在form表單裏面自動添加了一行隱藏的input標籤。

點擊提交按鈕,效果如下
在這裏插入圖片描述
其實就是已經正確跳轉了的。

👆演示的效果就是CSRF機制,能夠實現跨站請求僞造保護,是一個全局性的有一定的安全機制,保護服務器安全

但是:也會有針對性的黑客進行CSRF攻擊,這方面參考上面 pythenweb 開發中的csrf機制,CSRF機制也只是部分安全。

如果不想加載這個中間件,但又想用csrf功能,這個時候可以考慮另外的使用方式。註解,對部分【方法、模塊】對全局都可以進行攔截。
CSRF使用,含部分攔截使用說明

文章演示代碼參考

發佈了354 篇原創文章 · 獲贊 119 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章