Django 模板HTML转义和CSRF4.3
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Django 模板HTML转义和CSRF4.3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                - ?
- Django對字符串進行自動HTML轉義,如在模板中輸出如下值:
視圖代碼:
def index(request):return render(request, 'temtest/index2.html',{'t1': '<h1>hello</h1>'})
模板代碼:
{{t1}}
- 顯示效果如下圖:
?
會被自動轉義的字符
- html轉義,就是將包含的html標簽輸出,而不被解釋執行,原因是當顯示用戶提交字符串時,可能包含一些攻擊性的代碼,如js腳本
- Django會將如下字符自動轉義:
< 會轉換為<> 會轉換為>' (單引號) 會轉換為'" (雙引號)會轉換為 "& 會轉換為 &
- 當顯示不被信任的變量時使用escape過濾器,一般省略,因為Django自動轉義
{{t1|escape}}
關閉轉義
- 對于變量使用safe過濾器
{{ data|safe }}
- 對于代碼塊使用autoescape標簽
{ % autoescape off %}
{{ body }}
{ % endautoescape %}
- 標簽autoescape接受on或者off參數
- 自動轉義標簽在base模板中關閉,在child模板中也是關閉的
字符串字面值
- 手動轉義
{ { data|default:"<b>123</b>" }}
- 應寫為
{ { data|default:"<b>123</b>" }}csrf
- 全稱Cross Site Request Forgery,跨站請求偽造
- 某些惡意網站上包含鏈接、表單按鈕或者JavaScript,它們會利用登錄過的用戶在瀏覽器中的認證信息試圖在你的網站上完成某些操作,這就是跨站攻擊
- 演示csrf如下
- 創建視圖csrf1用于展示表單,csrf2用于接收post請求
def csrf1(request):return render(request,'booktest/csrf1.html')
def csrf2(request):uname=request.POST['uname']return render(request,'booktest/csrf2.html',{'uname':uname})
- 配置url
url(r'^csrf1/$', views.csrf1),
url(r'^csrf2/$', views.csrf2),
- 創建模板csrf1.html用于展示表單
<html>
<head><title>Title</title>
</head>
<body>
<form method="post" action="/crsf2/"><input name="uname"><br><input type="submit" value="提交"/>
</form>
</body>
</html>
- 創建模板csrf2用于展示接收的結果
<html>
<head><title>Title</title>
</head>
<body>
{{ uname }}
</body>
</html>
- 在瀏覽器中訪問,查看效果,報錯如下:
?
- 將settings.py中的中間件代碼'django.middleware.csrf.CsrfViewMiddleware'注釋
- 查看csrf1的源代碼,復制,在自己的網站內建一個html文件,粘貼源碼,訪問查看效果
防csrf的使用
- 在django的模板中,提供了防止跨站攻擊的方法,使用步驟如下:
- step1:在settings.py中啟用'django.middleware.csrf.CsrfViewMiddleware'中間件,此項在創建項目時,默認被啟用
- step2:在csrf1.html中添加標簽
<form>
{% csrf_token %}
...
</form>
- step3:測試剛才的兩個請求,發現跨站的請求被拒絕了,效果如下圖
?
取消保護
- 如果某些視圖不需要保護,可以使用裝飾器csrf_exempt,模板中也不需要寫標簽,修改csrf2的視圖如下
from django.views.decorators.csrf import csrf_exempt@csrf_exempt
def csrf2(request):uname=request.POST['uname']return render(request,'booktest/csrf2.html',{'uname':uname})
- 運行上面的兩個請求,發現都可以請求
保護原理
- 加入標簽后,可以查看源代碼,發現多了如下代碼
<input type='hidden' name='csrfmiddlewaretoken' value='nGjAB3Md9ZSb4NmG1sXDolPmh3bR2g59' />
- 在瀏覽器的調試工具中,通過network標簽可以查看cookie信息
- 本站中自動添加了cookie信息,如下圖
?
- 查看跨站的信息,并沒有cookie信息,即使加入上面的隱藏域代碼,發現又可以訪問了
- 結論:django的csrf不是完全的安全
- 當提交請求時,中間件'django.middleware.csrf.CsrfViewMiddleware'會對提交的cookie及隱藏域的內容進行驗證,如果失敗則返回403錯誤
?
總結
以上是生活随笔為你收集整理的Django 模板HTML转义和CSRF4.3的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Python 虚拟环境 virtuale
- 下一篇: 使用Docker快速搭建PHP开发环境
