在理解Django中的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使用,含部分攔截使用說明