1.客戶(模板頁面(html頁面) ) --------> 服務員(函數處理業務請求) --------> 廚子 (使用原材料作飯:數據庫相關的操做)html
2.模板頁面(views)---->控制器(controller:函數)---->模型 (models:建表與數據庫相關)前端
1.django獨有:M(model:用類建表)、T(tempalte:HTML模板) 、V(views:業務邏輯函數)ajax
M(model) : models
T(tempalte) : views
V(views): controller
1.三種安全攻擊:CSRF, xss, sql注入 2.csrf:跨站請求僞造攻擊sql
3.相關內容:(參考:http://www.javashuo.com/article/p-elkpezpl-eg.html)數據庫
django爲用戶實現防止跨站請求僞造的功能,經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能又分爲全局和局部。
全局:
中間件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。
@csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。
注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect
4.當用==post==提交數據的時候,django會去檢查是否有一個csrf的隨機字符串,若是沒有就會報錯,這也是以前咱們一直將其註釋的緣由django
# 1.開啓全局的csrf驗證:
# 1.1 settings中,打開註釋
'django.middleware.csrf.CsrfViewMiddleware',
# 1.2 表單中,開啓csrf_token
# html文件中:
<form>
{% csrf_token %} # 寫了會經過驗證
<input type='text'>
</form>
# 在views文件中:
def test1(request):
return HttpResponse("ok")
# 1.3 如上,全站都會進行csrf驗證
# 2.局部的函數, 不進行csrf驗證
# 2.1 settings中,打開註釋
'django.middleware.csrf.CsrfViewMiddleware',
# 2.2 在views中:
from django.views.decorators.csrf import csrf_exempt
5.當用戶經過get方式訪問頁面的時候,會生成一個csrf的隨機字符串,而且cookie中也存放了這個隨機字符串,當用戶再次提交數據的時候會帶着這個隨機字符串提交,若是沒有這個隨機字符串則沒法提交成功後端
6.CBV(class base views): 就是在視圖裏使用類處理請求安全
1.提升了代碼的複用性,可使用面嚮對象的技術,好比Mixin(多繼承)cookie
2.能夠用不一樣的函數針對不一樣的HTTP方法處理,而不是經過不少if判斷,提升代碼可讀性xss
from django.views.decorators.csrf import csrf_protect
from django.utils.decorators import method_decorator
from django.views import View
7.經過 ajax 驗證CSRF
若是經過ajax進行提交數據,這裏提交的csrftoken是經過請求頭中存放,須要提交一個字典類型的數據,即這個時候須要一個key(X_CSRFtoken)
在views中的login函數中:from django.conf import settings,而後打印print(settings.CSRF_HEADER_NAME),這裏須要注意一個問題,這裏導入的settings並非咱們在項目文件下看到的settings.py文件,這裏是是一個全局的settings配置,而當咱們在項目目錄下的settings.py中配置的時候,咱們添加的配置則會覆蓋全局settings中的配置
print(settings.CSRF_HEADER_NAME)打印的內容爲:HTTP_X_CSRFTOKEN。這裏的HTTP_X_CSRFTOKEN是django在X_CSRF的前面添加了HTTP_,因此實際傳遞的是就是X_CSRFtoken,而在前端頁面的ajax傳遞的時候因爲不能使用下劃線因此傳遞的是X_CSRFtoken
<body>
<form action="/test/" method="post">
{% csrf_token %}
<input type="text">
<input type="submit" value="sub">
</form>
</body>
<!-- 將token放置到請求頭中,攜帶過去 -->
<script>
//在頁面中會有一個隱藏的input標籤中,存放csrf驗證碼,咱們能夠經過僞類進行獲取
token = $('input[name="csrfmiddlewaretoken"]').val()
// headers : {'X-CSRFToken': token}
$.ajax({
type:'POST',
url:'/test/',
data:{'name':'xxxx'},
headers : {'X-CSRFToken': token},
sucess;fucntion(data){
console.log(data);
}
})
</script>
8.總結:
1.CSRF在ajax提交的時候是經過請求頭傳給後臺的
2.csrf在前端的key爲:X-CSRFtoken,到後端的時候django會自動添加HTTP_。所以最後爲:HTTP_X_CSRFtoken