MVC和MTV


1、MVC和MTV

1.MVC

1.客戶(模板頁面(html頁面) ) --------> 服務員(函數處理業務請求) --------> 廚子 (使用原材料作飯:數據庫相關的操做)html

2.模板頁面(views)---->控制器(controller:函數)---->模型 (models:建表與數據庫相關)前端

2. MTV

1.django獨有:M(model:用類建表)、T(tempalte:HTML模板) 、V(views:業務邏輯函數)ajax

M(model) : models
T(tempalte) : views
V(views): controller

2、CSRF

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
@csrf_exempt  
def test2(request):
return render(request, "test2.html")  # 這個頁面能夠不用驗證csrf
# 2.3 如上,部分函數不用驗證csrf
 
# 3.局部函數進行csrf驗證
# 3.1 settings中,註釋
# 'django.middleware.csrf.CsrfViewMiddleware',
# 3.2 在views.py中:
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def test3(request):
return render(request, 'test3.html')  # 只指定這個頁面須要驗證csrf
# 3.3 如上, 部分函數須要進行csrf驗證

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

@method_decorator(csrf_protect, name='get')  # name控制請求方式
class Test(View):
def get(self, request):
pass
def post(self, request):
pass

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

  • 3.csrf在form中提交的時須要在form表單中添加{% csrf_token %}

相關文章
相關標籤/搜索