# CSRF
* 全稱為Cross Site Request Forgery,跨站請求偽造
* 某些惡意網站上包含鏈接、表單按鈕或者JavaScript,會利用登錄過的用戶在瀏覽器中的認證信息視圖在web網站上完成默寫操作,這就是跨站攻擊
* 創建login用于展示表單
* 創建crsf用于接收post請求
```text
def login(request):
return render(request,'myapp/login.html')
def crsf(request):
name = request.POST['name']
context = {'name':name}
return render(request,'myapp/crsf.html',context)
```
* 配置url
```text
url(r'^crsf/$',views.crsf),
url(r'^login/$',views.login),
```
* 創建模板login.html用于展示表單
```text
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="{% url 'myapp:crsf' %}">
<input name="name"/><br />
<input type="submit" value="提交" />
</form>
</body>
</html>
```
* 創建模板crsf用于展示接收的結果
```text
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ name }}
</body>
</html>
```
* 在訪問中,如果報錯如下:

* 將settinsg.py的中間件代碼"django.middleware.crsf.CrsfViewMiddleware"注釋
* 查看login的源碼,復制,在自己的網站內建一個HTML文件,粘貼源碼,訪問查看效果
## 訪crsf的使用
* 在django的模板中,提供了防止跨站攻擊的方法,使用步驟如下:
* 1.在settings.py中啟動"django.middleware.crsf.CsrfViewMiddleware"中間件,此項在創建項目時,默認被啟用
* 2.在login.html中添加標簽
```text
<form>
{% csrf_token%}
....
</from>
```
* 3.測試剛才的兩個請求,發現跨站的請求被拒絕了,效果如下:
-
## 取消保護
* 如果某些視圖不需要保護,可以使用裝飾器crsf\_exempt,模板中也不需要寫標簽,修改crsf的視圖
```text
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def crsf(request):
name = request.POST['name']
context = {'name':name}
return render(request,'myapp/crsf.html',context)
```
* 運行上面的兩個請求,發現都可以請求
## 保護原理
加入標簽后,可以查看源代碼,發現多了如下代碼
```text
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="/crsf/">
<input type='hidden' name='csrfmiddlewaretoken' value='T6CFH7Q5sIepoujVMrnFnpEtkErPQowirYBwDi2icLkJt9g3Eb9EC3TXQL0KDA7X' />
<input name="name"/><br />
<input type="submit" value="提交" />
</form>
</body>
</html>
```
* 在瀏覽器的調試工具中,通過network標簽可以查看cookie信息
* 本站中自動添加了cookie信息,如下圖

* 查看跨站的信息,并沒有cookie信息,即使加入上面的隱藏域代碼,發現又可以訪問了
* 結論:django的csrf不是完全的安全
* 當提交請求時,中間件'django.middleware.csrf.CsrfViewMiddleware'會對提交的cookie及隱藏域的內容進行驗證,如果失敗則返回403錯誤